Jupyter Notebook에서 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
Reference
이 문제에 관하여(Jupyter Notebook에서 CTF (초급)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/usop4/items/6d3591ae40c09fd2c58e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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)
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
Reference
이 문제에 관하여(Jupyter Notebook에서 CTF (초급)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/usop4/items/6d3591ae40c09fd2c58e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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는 다차원 배열 등을 다루기 쉽게 만드는 모듈이지만 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
Reference
이 문제에 관하여(Jupyter Notebook에서 CTF (초급)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/usop4/items/6d3591ae40c09fd2c58e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
print(chr(int('0b01110100',0))) # t
마지막으로 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
Reference
이 문제에 관하여(Jupyter Notebook에서 CTF (초급)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/usop4/items/6d3591ae40c09fd2c58e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)