Hacking/System Hacking 18

Format String Bug(FSB)

Format String 이란 - 문자열 함수에서 사용하는 형식 문자열입니다. Printf("hacker %s\n",i); Format String Format String에는 특수 이스케이프 시퀀스가 존재합니다. %d 10진수 %u 부호 없는 10진수 %x 16진수 %s 문자열 %n 지금까지 출력한 바이트 수 %c 문자 /* format string 정상적인 사용 good.c*/ #include #include int main(int argc, char* argv[]) { char buf[20]; strcpy(buf, argv[1]); printf("%s\n",buf); return 0; } format string을 한 문자씩 읽어옴 format 인자가 아니라면 출력 format 인자(%s,%x 등)..

Heap Buffer Overflow(BOF)

Heap 이란? 동적 메모리 할당 (malloc 영역) 데이터 사이즈 알 수 없을 때 사용 Heap 영역은 실행시 할당 (stack 영역은 컴파일시 할당) 프로그래머에 의해 해지됨(free) Heap 영역은 낮은 주소에서 높은 주소로 자람 (stack은 반대) Heap buffer overflow - stack과 같이 인접한 변수를 덮어쓸 수 있음 - stack과 다른 구조, 직접적으로 RET 변조는 불가능 - stack overflow에 비해 취약점 발견 저조(정적 분석 / 인접 변수가 어떠한 역할인지 분석이 어려움) - UNLINK 취약점은 2004년에 패치 Heap overflow 손상받는 데이터는 인접 변수, 함수 포인터(거의 볼 수 없다) 1. heap1.c **dumpcode.h 파일 소스는 ..

Stack Buffer Overflow(BOF) - DEP+ASLR+ASCII Armor 우회(끝판대장) (RTL 공격)

*fedora 20 환경 ATTACK ASCII Armor는 공유 라이브러리 영역의 상위 주소에 0x00을 포함시키는 방법 우회 기법 - RTL - Chainning RTL - PLT & GOT Overwrite 공격 방법 PLT&GOT Overwrite (strcpy@plt 사용) plt에는 got으로 점프하는 주소가 있고 got에는 함수의 주소가 있다. got에 execve 함수의 주소를 넣는다. bss 영역에 execve의 인자로 사용할 /tmp/sh 문자열 복사 plt 호출 execve 인자 값 전달로 공격 RET로 끝나는 명령의 순서를 Gadget 이라고 합니다. 그 명령어에서 [pr] -인자 1개 pop ret [ppr] -인자 2개 pop pop ret [pppr] - 인자 3개 pop po..

Stack Buffer Overflow(BOF) - DEP+ASLR 우회 (RTL 공격)

ASLR(Address Space Layout Randomization) 메모리 영역의 주소 공간 배치를 랜덤화하여 공격을 방해 RTL 공격 시 환경 변수에 함수를 담고 그 주소를 사용했는데요 환경 변수가 ASLR 보호 기법으로 랜덤이 되어 주소가 바뀐다면 이용하기 어려워집니다. 그래서 DATA 영역에 있는 기계어 값에 실행에 필요한 내용을 넣고 그 주소를 이용하는 방법을 이용해서 DEP+ASLR 보호 기법을 우회해보겠습니다. 이 data 영역에는 실행 권한이 있습니다. 그리고 이 영역 안의 항상 있을법한 기계어 (ex \x01)를 파일명으로 사용하여 이전에 만들었던 /tmp/sh 파일에 대한 실행 명령어(/tmp/sh)를 넣어 우회합니다. /* sh.c */ #include int main() { se..

Stack Buffer Overflow(BOF) - DEP 우회 (RTL)

DEP 보호가 되어있을 때 우회하는 공격 기법입니다. RTL (Return To Libc) 공유 라이브러리를 이용하는 방법입니다. 프로그램 실행시 적재되고 여러 프로세스에서 공동으로 이용할 수 있는 라이브러리이며 메모리에서 실행 권한이 필수로 설정되어 있습니다. 공유 라이브러리 함수를 넣어서 공격하게 됩니다. 함수의 첫 번째 인자는 [EBP+8] ?? RTL의 공유 라이브러리 함수의 인자로 담을 내용에 관한 이야기입니다. 기본적으로 함수의 첫 번째 인자는 [EBP+8]인데요 그 이유에 대해서 알아보겠습니다.(위쪽이 낮은 주소) 먼저 메인 함수가 콜 됩니다. 인자는 뒤의 값이 먼저 스택에 올라가기 때문에 함수 내에서 사용되는 ebp+8의 값이 처음 인자의 값이 됩니다. 공격 시나리오 취약점이 있는 프로그램..

Stack Buffer Overflow(BOF) / BOF 보호 기법

메모리 구조 1. 커널 영역 커널 공간은 프로세스에서 직접 접근할 수 없는 공간 2. Off Limit 영역 커널 영역에 접근하지 못하도록 할당 해둔 공간 3. 유저 영역 유저가 실제 사용하는 영역(스택/ 힙/ 코드 영역) Null Pointer 영역 모두 0으로 되어있으며 변경이 불가능, 시스템 보호(에러 보고)를 위한 영역 [유저 영역] 프로그램을 동작하면 메모리에 프로그램이 동작하기 위한 메모리 공간이 생성되며, 상위 메모리는 stack 하위 메모리는 heap라는 메모리 공간이 형성 스택 영역(정적 할당) 매개변수, 반환 주소(RET), 지역변수 등의 데이터를 갖는 공간 함수가 종료되면 메모리 할당이 자동으로 해제됨 높은 주소에서 낮은 주소로 자람 공유 라이브러리 영역 프로그램 내부에서 사용하는 라..

쉘 코드 제작 2 (Shellcode)

쉘 코드 제작 순서 1. C언어로 기능 구현 2. gdb로 역 어셈블링해서 필요한 부분을 찾음 3. 시스템 콜에 필요한 부분을 어셈블리어로 구현 4. objdump로 기계어 추출 5. null 값이 있을 경우 제거 작업 (3 번에서 미리 해도 됨) 6. 기계어 코드를 하나의 문장으로 추출 7. 프로그램 내용부에 삽입 /bin/sh를 실행시키는 쉘코드를 만들어 보겠습니다. 1. C 코드로 제작 #include int main() { char *bash[2]; bash[0] = "\bin\sh"; bash[1] = 0; execve(bash[0], bash, &bash[1]); } execve는 프로그램을 실행하는 system call 함수입니다. 사용법은 아래와 같습니다. execve(const char ..

쉘코드 제작(shellcode)

이전에 만들었던 코드로 계속 진행하겠습니다. 위의 소스 코드는 정적 컴파일을 해야 분석이 용이합니다. (전 게시글 참조) 목적은 write 함수를 쉘코드로 제작하는 게 목적입니다. 그러면 gdb에서 write 함수에 대해 파악하는 것이 필요합니다. write(1,"hacker\n",7); 이 인자들이 있는 곳을 찾아야 합니다. mov가 되는 값들을 한번 살펴볼 필요가 있습니다. 7 write(1,"hacker\n",7); 인자들이 여기에 있다는 것을 확인할 수 있습니다. eax 빼고요 eax는 write의 시스템 콜 넘버입니다. http://asm.sourceforge.net/syscall.html Linux/i386 system calls 00 sys_setup [sys_ni_syscall] 01 sy..

Shellcode (쉘코드) GDB 사용법

쉘코드는 시스템의 명령을 실행할 수 있는 기계어 코드 쉘을 실행시키기 위한 기계어 코드이며 소프트웨어 취약점 이용을 위한 내용부에 사용이 됩니다. exploit는 취약점을 찾아서 원하는 명령을 실행하는 공격입니다. 쉘코드 제작 방법은 C언어로 코딩을 하고 그것을 어셈블리어로 분석하여 어셈블리어와 1:1대응되는 기계어로 제작을 합니다. 간단한 출력 프로그램을 만들어보겠습니다. 컴파일 합니다. strace - 시스템 콜 호출을 추적할 수 있는 프로그램 방금 만든 프로그램을 추적하면 알아보기 어려운 문자들로 나오지만 하단에 printf()와 매치되는 부분이 보입니다. write(1, "hacker\n",7) 이 부분이 출력을 C언어로 만들었던 출력을 위한 부분이라고 볼 수 있습니다. write는 리눅스 sys..

Backdoor - Netbus (트로이목마)

* 여기에 기술된 내용을 보고 악의적인 이유로 이용할 시 법적 책임은 자신에게 있습니다. GUI 형태로 되어있는 원격제어 백도어입니다. 재미있는 (?) 기능이 많이 보입니다. 이 프로그램이 동작하기 위해서 서버 파일을 실행 해야 합니다. patch.exe 파일을 실행하면 12345 포트가 열리게 됩니다. 그리고 patch.exe 파일은 실행하면 아무런 반응이 나오지 않습니다. 공격할 컴퓨터의 아이피 주소를 알고 있어야 합니다. patch.exe가 실행된 컴퓨터의 아이피 주소를 입력하고 connect 버튼을 누르면 접속이 됩니다. 해당 컴퓨터의 cdrom까지 열고 닫을 수 있습니다(!!). 그림 보여주기는 공격당한 컴퓨터에 있는 이미지 파일을 화면에 강제로 띄웁니다. 마우스 바꾸기는 마우스 좌 클릭과 우 ..