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

이 문제는 pwn중에서 가장 많이 풀린 문제이다. 일단 무슨 파일인지 알아보자.

 

 

보면 또 64비트 ELF파일이다. 그럼 실행시켜보자.

 

 

배스킨라빈스 31게임을 한다. 인터넷에서 필승법을 찾아서 시도했지만 쟤가 반칙을 쓰면서 졌다. 그럼 어쩔수 없이 디버깅을 해야겠다.

 

 

만약 이긴다면 저런 문구를 볼수있다. 일단 힌트가 ROP라고 한다.

 

 

일단 checksec을 통해 보호기법을 확인해보자. NX가 걸려있는걸 봐서는 확실히 힌트가 제대로 된것임을 대충 짐작할 수 있다.

 

 

일단 컴퓨터의 입장에서 your turn에 내가 입력을 넣어준다. 그러니 여기서 분명 오류가 나올것이라고 생각하고 보았다. 이 문제에서는 함수 이름을 바꾸지 않아서 금방 찾을 수 있었다. read함수를 보면 숫자를 입력받는데 문자열로 받고 있다. 그래서 오버플로우가 발생한다.

 

 

 

 

 

 

 

 

 

 

 

'ctf write-up > Codegate CTF 2018' 카테고리의 다른 글

Miro - crypto  (0) 2018.02.09
RedVelvet - reversing  (0) 2018.02.09
728x90

이번 ctf에서 가장 많이 풀린 리버싱 문제이다. 일단 어떤 파일인지 먼저 보자.

 

 

file 명령어를 통해 이 문제는 64비트 ELF파일임을 알았다. 이제 한번 실행을 시켜보자.

 

 

보면 flag를 입력하는곳이 있고 틀린 값이 들어오면 그냥 종료시켜버린다.

 

 

gdb-peda를 통해 종료시키는 함수를 찾았다. 일단 angr를 이용해서 풀것이기 때문에 이 주소를 적어두고 main문을 보자.

 

 

gdb-peda로 보면 0x4012aa에 보이는 func1처럼 밑으로 쭉 내리면 여러 함수들을 거치게 되어있다. 0x401277을 보면 글자수가 26글자인것을 알수있다. 일단 그걸 기억해두고 다시 내려보자.

 

 

여기부분이 일단 가장 괜찮아 보였다. 한번 코딩해보자.

 

 

이렇게 angr를 이용하여 코딩을 해주었다. angr 사용법은 나중에 자세히 포스팅 하겠다. 한번 돌려보자.

 

 

 

돌리면 저렇게 flag값이 나온다. 그런데 저게 인증이 안되었다. 그래서 happiness노래 가사를 찾고 b를 a로 바꾸어서 인증을 하니 성공했다.

 

 

이건 gdb-peda를 이용하여 푼것이고 아이다같은 디버거가 편하면 그걸로 풀어도 상관없다.

 

'ctf write-up > Codegate CTF 2018' 카테고리의 다른 글

Miro - crypto  (0) 2018.02.09
BaskinRobins31 - pwn  (0) 2018.02.09
728x90

아까전에 노트북을 업데이트를 위해 재부팅하였다. 그런데 갑자기 잘 되던 와이파이에 인터넷 없음이라는 것만 뜨고 인터넷 연결이 안되었다. 그래서 해결 방법을 찾아보았다.

 

 

 

일단 윈도우키랑 R키를 동시에 눌려서 실행창을 열어준다음 devmgmt.msc를 쳐서 장치관리자를 실행하자.

 

 

저기서 Intel(R) Dual Band Wireless-AC 3168을 지워준다. 이건 MSI기준이고 다른 노트북들도 그냥 Wireless라고 표시된 드라이버를 지우면된다.

 

 

그리고 네트워크 어댑터를 우클릭해서 하드웨어 변경 사항 검색을 클릭해준다. 그리고 재부팅을 해주자.

 

 

 

그러면 깔끔하게 고쳐진것을 볼수있다.

 

'Tip' 카테고리의 다른 글

한글 수식편집기 사용법  (0) 2018.08.06
리눅스 apt-get 에러날때  (0) 2018.05.15
외국사이트 우리말로 보기  (0) 2018.02.12
728x90

일단 홈페이지를 만들려면 PHP에 대해서 알아야된다. 물론 이 글을 읽는 사람들중에는 그정도는 다 알수도 있겠지만 일단 대충 집어본다.

 

 

D:\AutoSet10\public_html라는 디렉토리를 볼 수 있을것이다. 물론 C드라이브에 설치를 했으면 D를 C로 바꾸면 된다. 저 디렉토리는 아파치 웹 서버의 홈 디렉토리다. 설치를 다른곳에 했으면 오토셋을 열고 제어에 보면 홈 디렉토리 열기라는 버튼이 있을것이다.

 

 

디렉토리 안을 보면 index.php라는 PHP파일이 있다. URL의 끝이 파일이 아니라 디렉토리 형식으로 접근하는 경우에는 DirectoryIndex 옵션에 지정된 파일을 먼저 찾는다. 지금 보는 디폴트 웹 페이지가 실제로는 http://localhost/index.php의 경로를 가지지만 기본 설정 때문에 http://localhost라는 디렉토리 형식으로 접근해도 자동으로 index.php가 인식된다.

 

 

이제 각자 사용하는 에디터로 index.php를 열고 안에 모든 내용을 지운 다음 위와같이 입력해보자. 모든 프로그래밍 언어를 시작할때 처음 출력해보는 Hello World이다. 저렇게 치고 저장을 한 뒤에 홈페이지를 들어가보자.

 

이로써 가장 간단한 출력하는것을 배우게 된것이다.

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

홈페이지 제작 - 오토셋 설치  (0) 2018.01.29
728x90

웹해킹을 배워서 이제 한번 써보고 싶은데 공격하기에 마땅한 홈페이지가 없어서 고민인 사람들이 많다. 나도 그런 사람들중 한명이라서 직접 그냥 홈페이지를 만들기로 했다.

 

http://autoset.net/xe/여기를 들어가서 오토셋 10.7.0.1을 다운받는다. 물론 옛날버젼의 PHP를 사용하고 싶으면 9.1버젼을 다운받으면 된다. 그러나 나는 php7의 사용법도 익힐겸 그냥 최신버젼으로 받았다. 운영체제가 있는 드라이브는 피해서 설치하는것이 좋다

 

 

그리고 이렇게 웹서버와 MySQL을 켜준다. 일단 제대로 작동을 하는지 먼저 알아보자. http://localhost로 접속해보자.

 

 

이런 화면이 뜨면 정상적으로 작동을 하고 있는것이다.

 

 

밑부분에 보면 각각의 버젼이 나온다. 명심해야될건 PHP7을 쓴다는것이다. 이제 에디터를 설치해야된다. 나는 이후 포스팅에서 EditPlus라는 에디터를 쓸것이다.

 

 

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

홈페이지 제작 - PHP를 이용하여 출력하기  (0) 2018.01.29
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

 

드디어 Lord of SQLinjection을 다 끝내게 되었다. sql injection에 대해 많은것을 공부하고 실습할수있는 좋은 경험이였다.

728x90

이 문제는 소스 코드의 길이가 엄청 길다. 그래도 차근차근 읽어보자. 함수 reset_flag가 flag를 매번 리셋시키는것을 볼수있다. 그리고 여러가지 것들을 필터링하고 있다. 또 flag값은 100보다 크지않다. 일단 그냥 blind sql injection을 쓰면 reset_flag때문에 틀릴때 마다 초기화된다. 그래서 리셋이 되지 않기 위해서 에러 쿼리를 사용하자. 그런데 그렇게 되면 참과 거짓을 판단할수없다. 그럴때 쓰는게 바로 time based blind sql injection이다. sleep을 이용해서 참일때는 어느정도 돌고 거짓이면 실행이 안되게 코딩을 해주자.

 

 

이렇게 pw가 나오게 된다.

 

 

 

+ Recent posts