#PIE 가 적용되지 않은 문제에선 prctl(PR_SET_SECCOMP, mode, &prog) 에서 mode를 잘 보아라. strict일 경우 1로 로 인자가(mode)설정 됨. 이떄 PIE 가 적용되 있지 않는 특정상 mode가 전역변수 code 영역에서 정의 되어 있다면, 이 주소를 IDA나 그 외 툴, 방법을 이용하여 구한 후 이를 0이외의 수로 변경하면 필터를 우회하여 아무 함수나 사용하여 공격 가능..
오늘부터 시작된 하루 한 포스팅 SHA(System Hacking Advanced) 시리즈가 시작되었습니다!(그렇게 이틀이 지난 지금 작성중..)
와.. 너무 행.복. 하다
Sandbox: 외부의 공격으로부터 시스템을 보호하기 위해 설계된 기법.
SECCOMP - Secure Computing Mode
: Linux 커널에서 제공하는 process_sandboxing 기법. 정해지진 않은 syscall 호출시 SIGKILL_Signal 을 날린다.
Type of mode
1. Strict_mode Mode 1
: 말 그대로 엄격한 모드로 read, write, exit, sigreturn 즉 이 4개의 syscall만 호출 가능.
2. Filter_mode Mode 2
: syscall 별로 지정 가능. 커스텀 지정 가능한 모드.
Filter Mode - seccomp 라이브러리 함수 이용
: 이는 seccomp 라이브러리에서 제공하는 함수들로 Filter 하는 방법
* seccomp_init: SECCOMP 모드의 기본 값을 설정하는 함수. 임의의 시스템 콜이 호출되면 해당하는 이벤트 발생.
* seccomp_rule_add: SECCOMP의 규칙을 추가. 임의의 시스템 콜을 허용하거나 거부 가능.
* seccomp_load: 앞서 적용한 규칙을 애플리케이션에 반영.
Filter Mode - BPF(Berkeley Packet Filter)
: 임의 데이터를 비교하고, 결과에 따라 특정 구문으로 분기하는 명령어 제공. 이는 라이러리 함수를 통해 규칙을 정의한 것과 같이 특정 시스템 콜 호출 시 처리 이벤트를 명령어를 통해 구현 가능.
* BPF: 커널에서 지원하는 Virtual Machine 으로, 본 목적은 네트워크 패킷을 분석하고 필터링하는 것이다.
* BPF_LD: 인자로 전단된 값을 누산기에 복사. 이를 통해 값을 복사한 후 비교 구문에서 값 비교 가능.
* BPF_JMP: 지정한 위치로 분기.
* BPF_JEQ: 설정한 비교 구문이 일치할 경우 지정한 위치로 분기.
* BPF_RET: 인자로 전달된 값을 반환.
(음.. 뭐랄까 그냥 어셈 느낌이 물씬 난다.)
BPF Macro
: 우리 모두가 좋아하는 매크로이다.
* BPF_STMT(opcode, operand): operand 에 해당하는 값을 명시한 opcode로 값을 가져온다. opcode는 인자로 전달된 값에서 몇 번째 인덱스에서 몇 바이트를 가져올 것인지를 지정.
* BPF_JUMP(opcode, operand, ture_offset, false_offset): BPF_STMT 매크로를 통해 저장한 값과 operand를 opcode에 정의한 코드로 비교하고, 비교 결과에 따라 특정 오프셋으로 분기.
seccomp-tools
:바이너리를 분석하 때 seccomp 규칙을 분석하기 매우 어려워, 이를 도와 주는 도구
GitHub - david942j/seccomp-tools: Provide powerful tools for seccomp analysis
$ sudo apt install gcc ruby-dev
$ gem install seccomp-tools
Bypass SECCOMP
: SECCOMP은 시스템 콜과 전달되는 인자까지 추적하고 비교할 수 있다. 보통 인자를 비교하는 것은 너무 많은 예외 상황으로 대부분의 개발자는 시스템 콜을 호출하지 못하도록 설정한다. 그럼 이와 같은 기술이 적용된 바이너리는 어떻게 우회 할 수 있을까..?
1. 타 시스템 콜 호출
: 시스템콜은 300개 이상이고 현재에도 다양한 기능을 제공하기 위해 여러 시스템 콜이 개발 되고 있다. 이때 같은 기능을 하는 시스템콜이 존재 할 수 있는데, 이를 사용해 우회 할수 있다.
Ex. 시스템 콜 "open"이 규칙에 호출 하지 못하도록 정의되어 있다면, 같은 기능을 하는 "openat"으로 이를 우회 가능하다.
2. ABI(Aplication Binaray Interface)
: 이는 우리가 흔히 사용하는 아키텍처, x86, x86_64 외 다양한 "아키텍처"를 활용한 우회 방법이다. 이는 아키텍처 별로 명령어 세트, 기능, 크기의 차이에 따른 여러 (대안)커널 코드를 사용한 것으로, 64비트에서 32비트 애플리케이션을 실행 할때 32bit와 64bit는 서로 다른 시스템 콜 번호를 사용하며 이때 사용되는 호환 코드를 이용해 우회 하는 방법이다.
- 샌드박스(Sandbox): 외부의 공격으로부터 시스템을 보호하기 위해 설계된 기법
- SECure COMPuting mode (SECCOMP): 리눅스 커널에서 프로그램의 샌드박싱 매커니즘을 제공하는 컴퓨터 보안 기능
- Berkeley Packet Filter (BPF): BPF는 커널에서 지원하는 Virtual Machine (VM)으로, 본래에는 네트워크 패킷을 분석하고 필터링하는 목적으로 사용됨
- Application Binary Interface (ABI): 애플리케이션과 운영 체제 간에서 사용하는 저수준 인터페이스로 프로그램의 메모리 사용량을 줄일 수 있을 뿐만 아니라 프로그램 실행 속도도 향상됩니다.
'Pwnable > Tech' 카테고리의 다른 글
OOB - Out of Bounds (0) | 2022.02.14 |
---|---|
SHA - Master Canary (0) | 2022.02.11 |
FSB 에 대해 (0) | 2022.02.07 |
PIE와 RELRO (0) | 2022.01.27 |
-STACK- Stack Canary (0) | 2022.01.06 |