촉촉한초코칩
ctfd 구축 (1) REST API 본문
https://docs.ctfd.io/tutorials/api/using-ctfd-api
cURL을 사용하여 API 요청 생성 및 보내기
액세스
- 액세스 토큰 필요
- ctfd에 관리자로 로그인해서 토큰 생성
- Request Header: Authorization: Token <access token>, Content-type : application/json
- Request Payload : JSON 형식
API 엔드포인트 선택
- 사용자 생성하는 엔드포인트 선택 > post_user_list에 기록하기
적절한 페이로드 보내기
- POST 요청을 보낼 때는 새 사용자의 세부 정보가 포함된 JSON 페이로드 필요
- 개발자 도구(네트워크 탭 - Persist Logs)에서 ctfd 요청 검사 > 개발자 도구 열어둔 상태에서 ctfd 새 사용자 생성 > 제출 클릭하고 개발자 도구 확인
- 메소드 : post, 엔드포인트 : /api/v1/users
요청 보내기
- 터미널에 요청 명령 입력
- -X : 요청 방법 지정
- --header : 요청에 포함할 헤더 유형 지정
- -d : 전송하려는 데이터 지정
curl -X POST https://demo.ctfd.io/api/v1/users \
--header "Authorization: Token <access token>" \
--header "Content-Type: application/json"
-d "{\"name\":\"test\",\"email\":\"test@naver.com\",\"password\":\"test\",\"type\":\"user\",\"verified\":false,\"hidden\":false,\"banned\":false,\"fields\":[]}"
Python 스크립트 사용하여 API 요청 생성 및 보내기
사용자 추가 스크립트
#파이썬 설치 후 스크립트 작성
#add_user.py
#! python
import requests
import sys
def main():
try:
url = sys.argv[1]
token = sys.argv[2]
except IndexError:
print("Usage: python3 add_user.py <url> <admin_token>")
sys.exit(1)
# Create API Session
url = url.strip("/")
s = requests.Session()
s.headers.update({"Authorization": f"Token {token}"})
# NOTE: If you wish for the user's credentials to be emailed to them, pass the
# notify=true parameter in the URL. For example: /api/v1/users?notify=true
r = s.post(
f"{url}/api/v1/users",
json={"name":"user","email":"user@sampleuser.com","password":"user","type":"user","verified":False,"hidden":False,"banned":False,"fields":[]},
headers={"Content-Type": "application/json"},
)
print(r.json())
if __name__ == "__main__":
main()
CTFd 인스턴스의 URL과 생성된 액세스 토큰을 사용하여 실행한다.
./add_user.py https://<url> <token>
사용자 삭제 스크립트
#! python
#delete-user.py
import requests
import sys
def main():
try:
url = sys.argv[1]
token = sys.argv[2]
user_id = sys.argv[3]
except IndexError:
print("Usage: python3 delete_user_example.py <url> <admin_token> <user_id>")
sys.exit(1)
# Create API Session
url = url.strip("/")
s = requests.Session()
s.headers.update({"Authorization": f"Token {token}"})
# NOTE: It is important below to set the json argument so that requests sets the Content-Type correctly.
r = s.delete(f"{url}/api/v1/users/{user_id}", json="")
print(r.json())
if __name__ == "__main__":
main()
실행 : CTFd 인스턴스의 URL, 액세스 토큰, 사용자 ID 사용
./delete-user.py https://<url> <token>
비밀번호 사용
- 사이트 비밀번호가 있는 경우 CTFd에 API 요청을 보내려면 지정된 쿠키 이름과 사이트 비밀번호가 포함된 요청에 Cookie 헤더(site_password)를 포함한다.
- 모든 사용자 목록을 얻기 위해 cURL을 사용하여 엔드포인트에 GET요청 전송
$ curl \
--request GET https://<subdomain>.ctfd.io/api/v1/configs \
--header "Authorization: Token <token>" \
--header "Content-type:application/json" -d "{}"
--header "Cookie: site_password=samplepassword"