촉촉한초코칩

ctfd 구축 (1) REST API 본문

CTF/CTFD

ctfd 구축 (1) REST API

햄친구베이컨 2024. 5. 31. 18:10

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

개발자도구의 페이로드가 안 떠서 har 파일을 다운받음

 

요청 보내기

  • 터미널에 요청 명령 입력
  • -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"

'CTF > CTFD' 카테고리의 다른 글

ctfd 설치  (0) 2024.05.31