Jupyter Notebook에서 CTF (초급)

하이 레벨의 CTF에는 전혀 치아가 서 있지 않지만, 막상이라고 할 때 사용할 수 있도록 리스트업해 보았다.

시저 암호



잘 나오는 카이사르 암호.
def _rot13(c):
    if 'A' <= c and c <= 'Z':
        return chr((ord(c) - ord('A') + 13) % 26 + ord('A'))
    if 'a' <= c and c <= 'z':
        return chr((ord(c) - ord('a') + 13) % 26 + ord('a'))
    return c

def rot13(s):
    g = (_rot13(c) for c in s)
    return ''.join(g)

pycurl



curl을 파이썬에서 사용할 수 있게 되면, 패스워드 리스트 공격 등을 효율적으로 하기 쉬워진다. (아, 물론 CTF에서의 이야기예요・・・)
import pycurl
from io import BytesIO

buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, 'http://ctfq.sweetduet.info:10080/~q32/auth.php')
c.setopt(c.WRITEDATA, buffer)
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.HTTPPOST, [('password[1]', 'dummy'),('password[2]', 'dummy')])

c.perform()
c.close()

body = buffer.getvalue()
print(body.decode('iso-8859-1'))

음 c


import socket
import time

def mysend(s, message):
    time.sleep(0.1)
    message = message + '\n'
    s.send(message.encode())
    time.sleep(0.1)
    data = s.recv(1024).decode('utf-8').splitlines()[0]
    print(data)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('example.com', 1234))

numpy



numpy는 다차원 배열 등을 다루기 쉽게 만드는 모듈이지만 matplotlib과 함께 계산 결과를 대략 확인하는 데 편리합니다.
import numpy as np
import matplotlib.pyplot as plt

arr2d = []
arr2d.append([1,0])
arr2d.append([0,1])
arr2dnp = np.asarray(arr2d)
plt.imshow(arr2dnp)



바이너리, 문자열


print(chr(int('0b01110100',0))) # t


crypt



마지막으로 crypt. ksnctf의 John이라는 문제는 John the ripper라는 프로그램을 사용하여 패스워드 리스트에서 총칭하는 것이 왕도일지도 모르지만, Python의 crypt로 풀어내는 것도 스마트한 느낌으로 기분 좋다.
import crypt

s = '''
user00:$6$Z4xEy/1KTCW.rz$Yxkc8XkscDusGWKan621H4eaPRjHc1bkXDjyFtcTtgxzlxvuPiE1rnqdQVO1lYgNOzg72FU95RQut93JF6Deo/:15491:0:99999:7:::
user01:$6$ffl1bXDBqKUiD$PoXP69PaxTTX.cgzYS6Tlj7UBvstr6JruGctoObFXCr4cYXjIbxBSMiQZiVkKvUxXUC23zP8PUyXjq6qEq63u1:15491:0:99999:7:::
user02:$6$ZsJXadT/rv$T/2gVzYwMBaAsZnHIjnUSmTozIF/ebMvtHIJjikFehvB8pvy28DUIQYbTJLG6QAxhzJAKOROnZq0xV4hUGefM1:15491:0:99999:7:::
'''

salt = []
hash = []
for line in s.splitlines():
    m = line.split(":")
    n = m[1].split("$")
    hash.append(m[1])
    salt.append(n[2])

password = []
for line in open('password_list.txt', 'r'):
    password.append(line.strip())

for s in salt:
    for p in password:
        h = crypt.crypt(p, salt='$6$'+s+'$')
        if h in hash:
            print(p)
            break

좋은 웹페이지 즐겨찾기