Recently I needed a way of building an executable on a remote machine using only a keyboard. Basically I needed to "type out an executable" (think of it as I had a very basic "ah-hem" shell that I wanted to make more secure). Because my target host was Windows based, it is not as easy as uploading and compiling from source. I could of course simply use tricks found at http://commandlinekungfu.com to download the file, however I wanted to find a solution where this system didn't create any outgoing requests that resulted in the downloading of an executable. The technique described below is already being used by some very common cyber-security tools such as Fasttrack and sqlmap. It is an interesting solution, one that might help you out with a project in the future.
The problem is that you cant simply type out an executable binary. There are multiple characters that are not printable ascii, so your binary will fail if you try. However there are some tools that will allow us to convert the already compiled binary into ascii printable debug scripts, which can be reassembled using the native debug command on windows machines. Thus creating a "portable" binary that is Ascii printable, therefore gives us the ability to "type out an executable"
In order to do this we need a few things:
The Executable we want to transfer
UPX Packer (not needed but helpful)
dbgtool (Python / Windows)
For this article we will be using the windows Ncat binary (http://nmap.org/ncat/) and since my machine is OSX, the python based tools in our example.
Ncat is a feature-packed networking utility which will read and write data across a network from the command line.
Ncat was written for the Nmap Project as a much-improved reimplementation of the venerable Netcat. It uses both TCP
and UDP for communication and is designed to be a reliable back-end tool to instantly provide network connectivity to
other applications and users. Ncat will not only work with IPv4 and IPv6 but provides the user with a virtually limitless
number of potential uses.
Because our target is a windows host, we need to download and unpack nmap for Windows (ncat now is packaged with nmap). Because we are going to communicating this executable via ?keyboard? or some other slow method, we would be smart to compress this file as much as possible before we convert it. We will need to use a packer that self decompresses and retains the ability to execute.
UPX is a free, portable, extendable, high-performance executable packer for several different executable formats. It achieves an excellent compression ratio and offers very fast decompression. Your executables suffer no memory overhead or other drawbacks for most of the formats supported, because of in-place decompression.
Install UPX on your system:
OSX: sudo port install upx
Debian: sudo apt-get install upx-nrv
As you can see below, ncat can be compressed over 32% - totally worth it. (be warned, UPX packing executables decreases the stealthyness)
hevnsnt$ upx -9 -o ncat-upx.exe ncat.exe
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2009
UPX 3.05w Markus Oberhumer, Laszlo Molnar & John Reiser Apr 27th 2010
File size Ratio Format Name
-------------------- ------ ----------- -----------
175104 -> 57344 32.75% win32/pe ncat-upx.exe
Next we need to convert the UPX packed binary into a ASCII debug script, using the dbtool listed above:
python ./dbgtool.py -i ncat-upx.exe -o ncat-upx.scr
Take a second and open the ncat-upx.scr in whatever your favorite text editor is. As you can see, you now have a portable executable that is in printable ASCII.
Upload nc_upx.scr to the target Windows system (either by pasting in your shell, or however you need to do it) and then reconvert your binary to an executable with the following command: debug<DEBUGSCRIPT.scr
There will be some debug output such as this:
e df00 57 53 32 5f 33 32 2e 64 6c 6c
e df0c 4c 6f 61 64 4c 69 62 72 61 72 79 41
e df1a 47 65 74 50 72 6f 63 41 64 64 72 65 73 73
e df2a 56 69 72 74 75 61 6c 50 72 6f 74 65 63 74
This debug script will write a new file named #TEMP#. Simply rename this file to ncat-upx.exe and execute. Better get your ncat-fu ready, because your super over complicated, slow, ninja file upload is complete!