728x90

코게 2018문제를 풀다가 큰 수를 소인수분해해야될 일이 생겼다. 파이썬으로 코딩을 해도 시간이 엄청 걸릴것같아서 툴을 찾아보다가 yafu라는 툴을 알게 되었다.

 

https://sourceforge.net/projects/yafu/ 

 

일단 저 사이트에서 다운을 받자.

 

 

압축을 풀면 저렇게 구성되어 있다. 딱봐도 cmd같은곳에서 실행하게 생겼다. 일단 그러면 환경변수 설정부터 해두자. 어떻게 하는지는 다 알겠지만 일단 혹시나 해서 이번만 설명을 하겠다.

 

1. 제어판 -> 시스템 및 보안 -> 시스템

 

2. 내 PC 우클릭 -> 속성

 

 

위의 두가지 방법중 아무거나 사용하면 된다. 그렇게 들어간 다음 고급 시스템 설정을 클릭한다.

 

 

그리고 고급을 클릭한다.

 

 

 

그다음 환경변수를 클릭한다.

 

 

 

그리고 Path를 더블클릭해준다. 들어가서 새로 만들기를 클릭한후에 아까 yafu를 깔았던 곳으로 가자.

 

 

위에 주소창을 클릭하면 저렇게 경로가 뜬다. 저걸 복붙해주고 확인을 클릭하면 환경변수 설정이 된다. 물론 yafu말고 모든 환경변수 설정을 이렇게 하면 된다.

 

 

 

이제 명령 프롬프트를 들어가서 yafu-x64를 실행시켜보자. 위의 사진처럼 오류가 안나면 성공한것이다.

 

 

사용방법은 yafu-x64 factor(숫자) -threads2를 해주면된다. 물론 threads를 안하면 1로 기본 세팅된다. 보통 그냥 기본 세팅으로 하면 될것이다.

 

 

계산기를 보니 저기 3223857은 0x313131에 대한 10진수 값이다.

 

 

10진수를 넣으면 그냥 그 10진수가 나온다.

 

 

 

내가 풀 n은 띄워져 있어서 되는지 봤더니 그건 안되는것같다.

 

 

 

그럼 파이썬으로 코딩해서 공백을 없애주자!

 

 

이렇게 나온다. 다 나오기를 기다릴려고 했는데 너무 오래걸릴 것 같아서 그냥 중간과정만 캡쳐했다. 하여튼 이렇게 yafu라는 툴을 쓰면 된다.

 

 

'Hacking > Tool' 카테고리의 다른 글

NoSQLMap  (0) 2018.01.22
gdb-peda  (0) 2018.01.09
728x90

NoSQLMap 설치하는법

https://github.com/codingo/NoSQLMap에 나와있는데로 따라하면 된다.

 

NoSQLMap의 기능

 

 

 

NoSQLMap을 시작하면 나오는 화면이다. 1번을 선택하면 옵션을 세팅할수있다. 1번을 한번 선택해보자.

 

 

 

여러가지 옵션들을 세팅할 수 있다. 일단 1번을 보면 타겟의 호스트나 IP를 설정할 수 있다. 공격하려는 대상 웹서버나 MongoDB의 host나 IP를 세팅해주면 된다. 2번은 웹 어플리케이션 포트를 설정하는 것인데 웹 어플리케이션이 공격하려는 대상인 경우에 웹 어플리케이션의 TCP포트를 설정해준다. 그리고 3번은 URI 경로설정이다. 페이지 이름과 매게 변수를 포함하지만 호스트 이름이 아닌 URI의 일부를 적는곳이다. 예를들면 /app/acct.php?acctid=102같은게 있다. 4번은 HTTPS를 켜고 끄는것이다. 4번 같은 경우에는 꺼져있을 경우 치면 켜지고 반대로 켜져있을때 치면 꺼진다. 5번은 MongoDB의 포트를 설정해주는 것이고 6번은 HTTP요청 방법을 설정한다. 7번은 로컬 MongoDB랑 Shell의 IP를 설정하는 것이다. MongoDB 인스턴스를 대상 Mongo 설치의 IP로 직접 공격하여 대상 데이터베이스를 복제하거나 Meterpreter 셸을 열려면 이 옵션을 설정하면된다. 8번은 쉘 listner 포트를 설정하는 것이다. Meterpreter 셸을 여는 경우 포트를 설정하면 된다. 9번은 Verbose mode를 끄고 켜는 것이다.

 

 

이제 Scan for Anonymous MongoDB Access에 대해 알아보자. NoSQL DB Access Attacks과 NoSQL Web App attacks은 그냥 누르면 아까 설정했던 곳으로 공격이 실행되는것이라 딱히 볼게 없다. Scan for Anonymous MongoDB Access를 사용하기 위해 4번으로 들어가면 위의 화면처럼 뜬다. 이건 근데 언어 그대로 누르기만 하면 된다.  

 

 

마지막으로 Change Platform (Current: MongoDB)를 한번 들어가보자. 들어갔더니 아직은 저거 두개밖에 지원을 안하는것같다. CouchDB로 바꾸고 세팅을 들어가면 바껴있을까 궁금해서 한번 해보았다.

 

 

MongoDB에서 바껴있다. 그래도 벌써 두개나 지원하는게 좋은것같다. 일단 이렇게 기본적인 기능만 겉핥기식으로 봤다. 나중에 직접 MongoDB를 기반으로 만들어서 거기 공격을 해보는걸 포스팅 해야겠다.

 

 

참고자료

https://www.darknet.org.uk/2017/08/nosqlmap-automated-nosql-exploitation-tool/

https://github.com/codingo/NoSQLMap

 

 

'Hacking > Tool' 카테고리의 다른 글

yafu  (0) 2018.02.09
gdb-peda  (0) 2018.01.09
728x90

NoSQL이란?

NoSQL은 흔히 Not Only SQL의 약자이다. 단어 그대로 뜻을 보면 기존 관계형 DBMS가 가지고 있던 특성뿐만 아니라 더 추가된 특성들을 부가적으로 지원한다고 볼수있다. 우리가 흔히 사용하고있는건 RDBMS형태의 관계형 데이터베이스이다. 그러나 NoSQL은 관계형 데이터베이스가 아닌 다른 형태의 데이터 저장 기술을 의미한다. NoSQL제품군은 제품에 따라 특성이 달라 하나의 제품군으로 정의할수없다. 그래도 NoSQL제품군과 RDBMS의 대표적인 차이점을 보자.

  • 일단 데이터 관계와 정해진 규격이 없다.
  • Join과 트랜젝션을 지원하지 않는다.
  • 대다수의 제품이 오픈 소스이다.
  • 대부분 여러 DB서버를 묶어서 하나의 데이터베이스를 구성한다.
  • DB의 서비스가 중단이 없고 자동 복구 기능을 지원한다.

NoSQL의 종류

 

1. Key-Value Store

가장 단순하고 구현하기 쉽다. 데이터가 키와 값의 쌍으로 저장되는데 키는 값에 접근하기 위한 용도로 사용되고 값은 이미지나 비디오를 포함한 어떠한 형태의 데이터도 담을 수 있다. 간단한 API를 제공해서 질의의 속도도 빠른편이다. 그러나 값의 내용을 사용한 쿼리가 불가능하다. 그래서 사용자는 키를 사용해 값을 읽어들이고 어플리케이션 레벨에서 적절히 처리해야 된다. 이를 사용한 NoSQL DB는 Voldemort, Amazon DynamoDB, Riak등이 있다.

 

2. Column family store

이 모델은 여러 서버에 분산된 수많은 데이터를 저장하고 처리하기 위해 만들어졌다. 특이하게 키에서 필드를 결정한다. 그래서 클러스터링이 쉽게 이뤄지고 time stamp가 존재해서 값이 수정된 히스토리를 알 수있다. 그리고 값들은 일렬의 바이너리 데이터로 존재해서 어떠한 형태의 데이터로도 저장될 수 있다. 그러나 Blob단위의 쿼리가 불가능하다. 그리고 Row와 Column의 초기 디자인이 중요하다. Schema-less지만 새로운 필드를 만드는 비용이 많이 들어서 사실상 결정된 schema를 변경하기는 힘들다. 이를 사용한 NoSQL DB는 HBase, Cassandra, Hypertable등이 있다.

 

3. Document DB

기본적으로는 Key-Value Store와 비슷하다. 데이터와 키는 Document형태로 저장된다. 다른점이라면 Value가 계층적인 형태인 Document로 저장된다는 것이다. 각 키마다 nested value를 허락한다. 검색에 최적화 되어있다. 그러나 사용이 번거롭고 쿼리가 SQL이랑은 다르다. 질의의 결과가 JSON이나 xml 형태로 출력되기 때문에 그 사용 방법이 RDBMS에서의 질의 결과를 사용하는 방법과 다르다. 이를 사용한 NoSQL DB는  MongoDB, CouchDB, MarkLogic가 있다.

 

4. Graph DB

실제 세계의 데이타를 관계와 함께 표현하기 위해 디자인된 모델로써, 데이터는 연속적인 노드, 관계, 특성의 형태로 저장된다. 다시 말해 그래프 형태로 저장된다는 뜻이다. 따라서 그래프 모델에서의 질의는 그래프 순회를 통해 이루어진다. 개체와 관계를 그래프 형태로 표현한 것이므로 관계형 모델이라고 할 수 있으며, 데이터 간의 관계가 탐색의 키일 경우에 적합하다. 페이스북이나 트위터 같은 소셜 네트워크에서(내 친구의 친구를 찾는 질의 등) 적합하고, 연관된 데이터를 추천해주는 추천 엔진이나 패턴 인식 등의 데이터베이스로도 적합하다. 또한 집합 지향 모델과는 다르게 개체의 ACID 트랜잭션을 지원한다. 그러나 클러스터링에는 적합하지 않다. 또한 질의 언어도 특화되어 있어 배우기 어렵다. 이를 사용한 NoSQL DB는 Neo4J, InfoGrid, Infinite Graph가 있다.

 

NoSQL Injection

관계형 제약 조건과 일관성 검사 횟수를 줄임으로써 NoSQL 데이터베이스는 성능 및 확장 이점을 제공한다. 그러나 이런 DB는 기존 SQL구문을 사용하지 않아도 주입공격에 잠재적으로 취약할 수 있다. 이러한 NoSQL 주입 공격은 선언적 SQL 언어가 아닌 절차 언어 내에서 실행될 수 있으므로 잠재적 영향은 기존 SQL 주입보다 크다. 현재 150 개가 넘는 NoSQL 데이터베이스가 응용 프로그램 내에서 사용 가능하며 다양한 언어 및 관계 모델로 API를 제공한다. 각각은 다른 기능과 제한을 제공한다. 그것들 사이에 공통 언어가 없으므로 예제 주입 코드는 모든 NoSQL 데이터베이스에 적용되지 않는다. 이러한 이유로 NoSQL 주입 공격을 테스트하는 사람은 특정 테스트를 수행하기 위해 구문, 데이터 모델 및 기본 프로그래밍 언어를 숙지해야한다. NoSQL 주입 공격은 기존 SQL 주입과 달리 응용 프로그램의 다른 영역에서 실행될 수 있다. SQL 인젝션이 데이터베이스 엔진 내에서 실행되는 곳에서는 NoSQL API 사용 및 데이터 모델에 따라 애플리케이션 계층이나 데이터베이스 계층에서 NoSQL 변형이 실행될 수 있다. 일반적으로 NoSQL 주입 공격은 공격 문자열이 구문 분석, 평가 또는 NoSQL API 호출로 연결되는 위치에서 실행된다.

 

NoSQL Injection in MongoDB

MongoDB는 흔히 쓰이고 있는 NoSQL DB이다. 위에서 말했듯이 Document DB이다. 그렇기 때문에 MongoDB API는 BSON(Binary JSON)호출을 기대하고 안전한 BSON쿼리 어셈블리 툴을 포함하고 있다. 그러나 직렬화되지 않은 JSON 및 JavaScript표현식이 여러 대체 쿼리 매개 변수에서 허용된다. 임의의 JavaScript 입력을 허용하는 가장 일반적으로 사용되는 API 호출은 $ where 연산자이다.

 

https://github.com/cr0hn/nosqlinjection_wordlists여기를 보면 쿼리문들을 잘 정리해놨다.

 

 

 SQL Injection

NoSQL Injection 

SELECT * FROM accounts WHERE username = '$username' AND password = '$password'  

 db.accounts.find({username: username, password: password});

SELECT * FROM accounts WHERE username = 'admin' -- AND password = ''

 { "username": "admin", "password": {$gt: ""} }

 

MongoDB에서 $gt는 필드의 값이 지정된 값보다 큰 document를 선택한다. 따라서 위의 명령문은 데이터베이스의 비밀 번호를 빈 문자열과 비교하여 큰것을 나타내며, 이는 참을 반환한다. 동일한 결과는 $ne 와 같은 다른 비교 연산자를 사용하여 얻을 수 있다. 그럼 MongoDB의 연산자를 알아야지 injection할 수 있을 것이다.

 

연산자

설명

$eq

== 

$gt 

$gte 

>= 

$lt 

$lte 

<= 

$ne 

!= 

$in 

주어진 배열에 속하는값

$out 

주어진 배열에 속하지 않는 값 

 

 

 

 

 

 

일단 이렇게 연산자가 있다. 흔히 SQL Injection에서 쓰이는 것들로 쿼리만 맞게 쓰면 될것같다.

 

{"id":{"$ne": 1},"pw":{"$ne": 1}}  

 

$ne는 위에 표처럼 값이 다를때 1을 반환한다. 그러면 위의 쿼리문을 보면 id와 pw가 다를 것이기 때문에 1을 반환할것이고 "$ne": 1과 같이 뒤에 1이랑 비교를 하고있으니 접속이 될것이다.  

 

 

'Hacking > Web Hacking' 카테고리의 다른 글

SSRF  (0) 2018.01.10
728x90

SSRF란?

SSRF는 Server-side Request Forgery의 약자이다. CSRF와 달리 서버가 직접 호출해서 발생하는 문제이다. 이를 통해서 외부에서 내부망에 대해 접근하거나 스캔하고 각종 보안장비들을 피해갈 수 있다.

 

SSRF는 사용자 입력을 받아 서버가 직접 다른 웹이나 포트에 직접 접근해서 데이터를 가져오는 기능들에서 주로 발생한다. 별로 없을 것 같은 기능이지만 실제로 굉장히 많이 쓰이고 있는 기능이다.

 

URI의 구조

일단 URI를 처음 들어본 사람도 있을것이다. URI를 간단히 설명하면 URL과 URN을 합친것이다. 물론 URL과 URN은 교집합이 존재한다. 간단히 예시를 들어보자.

 

http://www.skyhell.co.kr:80/main/photo.php?url=apple#top

 

위에 임의로 URI를 만들어 보았다. 이제 저 URI를 하나하나 분석해 보자.

 http: 

 프로토콜

 www

 서브도메인 

 skyhell

 도메인

 co

 ccTLD(Country Code Top Level Domain) 

 kr

 TLD(Top Level Domain) 

 80 

 포트

 main 

 경로 

 photo 

 페이지 

 php 

 확장자 

 url=apple 

 파라미터 

 top 

 Anchor 

 

위의 예시에서 http:에서 main까지가 URL이고 www부터 apple#까지가 URN이다. 그리고 그 두개를 합친것이 URI가 되는것이다.

URL Parser

각각의 언어들마다 URI을 분석하는 parser가 있다. 이 parser들은 분석하는 과정이 약간씩 다르고 parser도 완벽하지 않아서 모든 사용자의 입력을 예상할수 없다. 여기서 취약점이 나올 수 있다.

 

SSRF in cURL

이렇게 입력을 해주면 당연히 google로 접속해야 될것 같지만 korec 홈페이지로 접속이 됩니다. 어떻게 이런일이 일어났을까? URL parser들이 url을 분리하는 부분이 달라서 특정 부분들은 다시 도메인으로 인지시킬 수 있다. curl같은 경우에는 @의 오른쪽을 도메인으로 사용하기 때문에 웹에서는 google.com으로 인지하는것으로 끊어졌지만 내부 curl로 넘어오는순간 오른쪽 부분을 도메인으로 보고 호출하는 것이다.

 

위처럼 개행문자를 이용하는 방법도 있다. 지금 로컬서버로 연결을 끊어놔서 그렇지만 열어두면 앞에 로컬서버로도 들어가지고 뒤에 korec 홈페이지로도 들어가진다.

이것도 개행문자를 쓰는것과 비슷한데 간단히 CR과 LF를 이용하는 방법이다.

 

SSRF 공격

 

php는 http://Wrapper를 지원하기 때문에 fopen(), include/require, cURL등에 인자로 http://url형태를 넘겨 외부 도메인에 있는 리소스를 가져올 수 있다. http://이외에도 다양한 Wrapper를 사용할 수 있고 위의 함수들 뿐만 아니라 user input을 참고해서 외부 request를 보내는 상황이면 어디서든지 발생할 수 있다.

상위 디렉토리 우회는 " ../ "로 한다. 이때 웹서버 루트가 아니라 파일시스템 루트까지 가능하다.

확장자 우회는 " %00 ", " ? ", " # "으로 한다.

?url=http://localhost/server-status를 통해 localhost service에 접근한다.

?url=file:///etc/passwd를 통해 file system에 접근한다.

server application에서 사용하는 request방식에 따라 이 밖의 url schema도 사용할 수 있다. (dict://, gopher://, 1dap://)

 

이제 제대로 공격을 하는 방법을 보자

먼저 필터링 하지 않는 url을 알아야 된다.

http://127.0.0.1:20/?@google.com:80/

http://127.0.0.1:20/#@google.com:80/

http://google.com:80+&@google.com:80#+@127.0.0.1:22/

http://127.0.0.1:22/+&@google.com:80#+@google.com:80/

http://google.com:80+&@127.0.0.1:22/#+@google.com:80/

 

url blacklist라는 것이 있다. blacklist로 막은 것들은 우회가 가능하다.

http://hello@www.korec.kr/

아까 curl처럼 이것도 이렇게 하면 @의 왼쪽에 있는 것들은 무시된다. 원래는 id:pw@url 형식으로 사용하도록 되어있기 떄문이다.

 

그리고 이제 필터링 하지 않는 url을 찾아냈을때, 이를 이용해서 어떻게 localhost에 접근하는지 알아보자.

localhost등을 넘기다가 필터링 당하는 경우라던지 url schema를 gopher://등으로 변경해야 하는 경우, 또 데이터를 가공해야 되는 경우에 open redirect 취약점이 존재한다면 그것을 이용해 일단 내 서버로 요청하게 한 다음에 내 서버에서 요청을 적당히 처리하여 반환하도록 할수있다.

 

SSRF를 이용해 서버가 어떤 데이터를 수신했을때 그 데이터가 적절한 형태인지 체크한다면 형식을 맞춰주어야한다. 보통 Forged request를 보내는 타겟이 내 서버가 되기 때문에 형식을 맞춰 보내는것은 어렵지 않은데 victim으로 보내야되는 데이터가 php source같이 실행되어야 하는 경우 형식을 맞춰주면서 그냥 데이터가 되어버려서 실행이 되지 않는다. 그래서 이를 우회해야된다. command curl은 패턴을 지정하여 여러 request를 보낼수있는데 이때 모든 response가 concatenate되기 때문에 이를 이용해 형식을 맞출수있다.

curl http://mserv.com/[1-3].php

 

 

 

 

'Hacking > Web Hacking' 카테고리의 다른 글

NoSQL Injection  (0) 2018.01.21
728x90

gdb-peda 설치하는법

 

1. git clone https://github.com/longld/peda.git ~/peda

2. echo "source ~/peda/peda.py" >> ~/.gdbinit

3. echo "DONE! debug your program with gdb and enjoy"

 

위 표의 3개를 순서대로 쳐주면 gdb-peda를 쓸수있다.

 

gdb-peda의 기능

 

 

그냥 disas main을 하면 일반 gdb처럼 글자색이 동일하다.

 

 

그러나 pdisas main을 하게되면 글자색이 구분되어 있어 훨씬 보기 편해진다.

 

 

또 메타스플로잇에 내장되어있는 패턴 페이로드 생성기가 peda에 내장되어 있어서 일일이 메타스플로잇에서 패턴을 생성하고 복붙하는 작업을 줄일수있다.

 

 

또한 pattern search를 사용하면 패턴 시작위치부터 EIP까지의 거리를 알수있다.

 

 

그리고 ropsearch "검색어"를 통해 쓸만한 가젯들을 찾아낼수도 있다.

 

 

 

그리고 공격 유형에 맞게 쉘코드를 생성해주는 기능도 있다.

 

 

또한 skeleton이라는 기능이 있는데 이 기능은 바이너리 공격 코드를 자동으로 생성해주는 기능이다. 바이너리 공격 형태와 생성할 파일명을 위와같이 설정해주면된다. 이러면 공격자는 생성된 파이썬코드의 일부만 수정하여 간편하게 공격을 할수있다.

 

#!/usr/bin/env python
#
# Template for local argv exploit code, generated by PEDA
#
import os
import sys
import struct
import resource
import time

def usage():
    print "Usage: %s target_program" % sys.argv[0]
    return

def pattern(size=1024, start=0):
    try:
        bytes = open("pattern.txt").read(size+start)
        return bytes[start:]
    except:
        return "A"*size

def nops(size=1024):
    return "\x90"*size

def int2hexstr(num, intsize=4):
    if intsize == 8:
        if num < 0:
            result = struct.pack("<q", num)
        else:
            result = struct.pack("<Q", num)
    else:
        if num < 0:
            result = struct.pack("<l", num)
        else:
            result = struct.pack("<L", num)
    return result

i2hs = int2hexstr

def list2hexstr(intlist, intsize=4):
    result = ""
    for value in intlist:
        if isinstance(value, str):
            result += value
        else:
            result += int2hexstr(value, intsize)
    return result

l2hs = list2hexstr

def exploit(vuln):
    padding = pattern(0)
    payload = [padding]
    payload += ["PAYLOAD"] # put your payload here
    payload = list2hexstr(payload)
    args = [vuln, payload]
    env = {"PEDA":nops()}
    resource.setrlimit(resource.RLIMIT_STACK, (-1, -1))
    resource.setrlimit(resource.RLIMIT_CORE, (-1, -1))
    os.execve(vuln, args, env)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        usage()
    else:
        exploit(sys.argv[1])

 

이것이 sol.py의 소스코드이다.

 

 

context라는 기능도 있는데 이것을 치면 메모리/코드구조를 gdb에 비해 보기쉽게 나타내준다. 물론 context code라는 식으로 입력하면 따로따로 볼수도 있다.

 

 

그리고 또 find라는 명령어를 통해 특정 스트링도 찾을수있다.

 

 

 

checksec이랑 aslr이라는 명령어로 보호기법이 걸려있는지 체크도 할수있다.

 

마무리

위에 말했던 기능말고도 strings같은 굉장히 많은 기능들이 있다. phelp라는 명령어를 통해 한번 자세히 알아보면 좋을것같다.

 

 

 

 

 

 

 

 

 

 

 

'Hacking > Tool' 카테고리의 다른 글

yafu  (0) 2018.02.09
NoSQLMap  (0) 2018.01.22

+ Recent posts