Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Pyison — 파이써닉 AI 크롤러 타르핏 | Kitploit
도구/GitHubGitHub/jonaslong/pyison
Defensive ToolsScripting & AutomationWeb SecurityLearning & EducationCrawlerAnti-Bot
GitHubjonaslong/pyison

Pyison

파이써닉 AI 크롤러 타르핏

저장소 보기
1222411개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Pyison

Pyison은 AI 웹 크롤러를 위한 타르핏(tarpit)입니다

소개

  • 모든 웹 크롤러와 마찬가지로 AI 봇은 웹 서버에서 페이지를 요청한 다음 페이지의 링크를 따라 다른 페이지로 이동합니다. 이렇게 하면 전체 웹사이트의 색인을 구축할 수 있습니다.
    • 하지만 다른 웹 크롤러와 달리 AI 봇은 몇 가지 고유한 문제를 제기합니다.
      • 서버 관리자는 웹 크롤러에게 크롤링해야 할 페이지와 크롤링하지 말아야 할 페이지를 알려주는 robots.txt 파일을 구성할 수 있습니다.
        • 일부 AI 크롤러는 이 파일을 무시하는 것으로 밝혀졌습니다. 사용자가 명시적으로 크롤링을 거부했음에도 이러한 봇이 웹사이트 데이터를 LLM 훈련에 사용하도록 허용하는 것은 개인정보 및 저작권 문제가 있습니다.
        • 일부 크롤러는 속도 제한(rate limiting)도 무시합니다. 가능한 한 빠르게 페이지를 요청하면 웹 서버에 상당한 부하를 줄 수 있습니다.
    • 여기서 Pyison이 등장합니다. 다른 AI 크롤러 타르핏(Nepenthes, Iocane)과 마찬가지로 Pyison은 웹 크롤러에게 사이트 내 다른 페이지로 향하는 끝없는 링크 목록을 제공합니다. 이로써 크롤러를 단일 사이트에 가둬 두고, 계속해서 늘어나는 링크의 바다를 끝없이 탐색하게 만듭니다.
      • AI 크롤러를 한곳에 붙잡아 두면 사이트 소유자가 LLM에 제공하고 싶지 않은 사이트의 다른 부분을 크롤러가 색인하는 것을 방지할 수 있습니다.
      • 동시에 이러한 페이지에는 쓸모없는 텍스트가 대량으로 포함될 수 있습니다. LLM이 이 텍스트를 모델에 통합하면 무작위 입력으로 인해 응답의 일관성이 떨어지면서 점차 "오염"될 수 있습니다.

동기

  • LLM 콘텐츠 도용 증가에 대응하는 유용한 소프트웨어 만들기
  • 기존 AI 타르핏의 문제점 해결:
    • 마르코프 체인, LLM 또는 기존 작성 샘플 없이 무작위 텍스트 생성
    • 크롤러가 종종 일반 사용자로 위장하므로 User-Agent 헤더로 AI 봇을 차별하지 않음
    • 탐지를 방지하기 위해 현실적인 블로그풍 사이트 설계
      • 추가 구성을 허용하는 매우 사용자 정의 가능한 프레임워크 구축
    • 기존 웹사이트에 쉽게 통합할 수 있는 솔루션 제공
      • 리버스 프록시/특정 웹 서버를 지원하지만 요구하지 않으며, 문서 루트 설정을 통한 하위 경로 구성 제공
    • 전체 CMS나 기능이 풍부한 웹 서버 대신 최소한의 리소스로 실행

기술 사양

  • 이 프로젝트는 Python의 HTTPServer 라이브러리를 사용하여 동적 웹 서버를 실행합니다.
  • 문장은 무작위 영어 단어와 "불용어(stop words)"의 50/50 비율로 생성됩니다.
  • Pyison은 전역 솔트(salt)와 페이지 URL을 사용하여 RNG를 시드(seed)합니다. 이렇게 하면 크롤러가 페이지를 다시 로드하여 "정상 작동 확인(sanity check)"을 수행하더라도 마지막으로 확인했을 때와 동일한 페이지가 반환됩니다. 동시에 Pyison을 사용하는 모든 사이트가 동일하게 보이지 않도록 서로 다른 서버는 서로 다른 전역 시드를 사용해야 합니다.
  • Pyison은 실제로 영구 파일을 생성하지 않기 때문에 무제한의 페이지를 생성할 수 있습니다. 동적 웹 서버이므로 HTML을 생성하여 클라이언트로 전송할 뿐입니다.
  • HTML 콘텐츠 태그, CSS 포맷팅 및 이미지를 사용하면 크롤러에게 사이트가 좀 더 현실적으로 보일 수 있습니다.
  • config, 정적(static), 템플릿 파일을 변경하여 프로그램을 다시 작성하지 않고도 Pyison의 출력을 구성할 수 있습니다.
  • 크롤러가 해당 HTTP 동사가 구성되어 있는지 테스트하는 경우를 대비해 Pyison은 잘못된 POST 및 PUT 요청에 404로 응답합니다.

시작하기

  • 이 프로젝트를 로컬 폴더에 클론합니다.

  • config/config.json 파일에서 설정을 변경합니다.

    • random-seed를 임의의 숫자로 설정하세요!
    • 서버가 사용할 port 번호를 설정하세요.
    • 자세한 내용은 구성 섹션을 참조하세요.
  • (선택 사항이지만 권장) HTML 템플릿, CSS, 이미지 및 robots.txt를 원하는 대로 수정하세요.

    • 페이지가 서로 다르게 보이면 이 프로젝트가 더 효과적이며, HTML 및 CSS 구조를 변경하여 이를 수행할 수 있습니다. 일부 요소를 재배열하고 이름을 바꾸거나 완전히 다시 작성하세요.
  • (선택 사항) 영향을 받는 봇을 변경하려면 robots.txt를 편집하세요.

  • 아래 방법 중 하나로 서버 환경을 설정하세요.

  • 서버를 리버스 프록시 뒤에 배치하세요.

    로컬에서 실행

    • nltk 설치
      • pip install nltk
    • Pyison 실행
      • python3 src/server.py
    • 실행 확인
      • 브라우저에서 http://localhost:<your port number> 열기

    Docker

    docker compose 사용

    • 다음을 포함하는 최소한의 docker-compose.yml 파일을 만듭니다.

리버스 프록시

이 콘텐츠를 제공하려면 리버스 프록시를 사용하는 것이 적극 권장됩니다. 리버스 프록시는 페이지 캐싱과 속도 제한 도입으로 서버 부하를 줄일 수 있을 뿐만 아니라 HTTPS로 콘텐츠를 제공하고 일부 기본적인 웹 서버 취약점으로부터 보호할 수 있습니다.

고려 사항

  • 이 예제는 Nginx Proxy Manager를 사용하지만, 어떤 리버스 프록시 소프트웨어에서도 작동해야 합니다.
  • Pyison은 NPM의 가장 엄격한 SSL 설정을 지원합니다.
  • NPM은 특별한 구성 없이도 User-Agent HTTP 헤더를 NPM에서 Pyison 서버로 전달해야 합니다. 필요한 경우 proxy_pass_header User-Agent;를 사용하세요.

독립 서브도메인 구성

  • UI에서 다음 설정을 선택하거나 구성 파일에 동일한 설정을 입력하세요:

    NGINX 리버스 프록시 인터페이스. "Edit Proxy Host" 대화상자가 열려 있습니다.
    • Domain Names: tarpit.example.com과 같이 사용자가 제어하는 도메인 또는 서브도메인
    • Scheme: http
    • Forward Hostname / IP: localhost 또는 docker 네트워크를 사용하는 경우 docker 컨테이너 이름
    • Forward Port: docker-compose/run 명령/config.json에 정의된 포트(기본값은 80)
    • Cache Assets 및 Block Common Exploits를 활성화하되, Websockets Support는 활성화하지 마세요.

하위 경로 구성

  • 하위 경로에서 Pyison을 사용하려면 다음 location 구성을 사용하세요.

    root@kitploit:~
    # Handles the root page ("example.com/tarpit")
    location /tarpit {
        proxy_pass http://localhost:80;
    }
    
    # Handles all sub-pages ("example.com/tarpit/a" and "example.com/tarpit/a/b")
    location /tarpit/ {
        proxy_pass http://localhost:80;
    }
    
    # Handles all urls with a 3-letter file extension ("example.com/tarpit/style.css" and "example.com/tarpit/images/picture.jpg")
    # Note that the ~ denotes regex matching. The string immediately following it must be a valid regex statement.
    location ~ .*\/tarpit\/.*\....$ {  
        proxy_pass http://localhost:80;
    }
    
  • 다음은 UI를 사용한 작동 설정입니다:

    NGINX 리버스 프록시 인터페이스. "Edit Proxy Host" 대화상자가 "Custom locations" 탭으로 열려 있습니다.
    • 첫 번째 location 블록인 /tarpit에는 사용자 지정 구성이 없습니다. 위에 정의된 첫 번째 location 블록처럼 동작합니다.
    • 두 번째 location 블록인 /tarpit/에는 위에 정의된 두 번째 및 세 번째 location 블록이 포함됩니다.
    • tarpit을 원하는 루트 경로로 바꾸세요.
      • /tar/pit과 같은 더 깊은 루트 경로를 사용하는 경우, 세 번째 location 블록은 정규식을 사용하므로 모든 슬래시는 백슬래시로 이스케이프해야 합니다.
        • 예: /tar/pit은 세 번째 location 블록에 가 필요합니다.

구성

  • config.json 파일은 쉬운 사용자 지정을 위한 다양한 설정을 정의합니다.
  • port (기본값 80)
    • 콘텐츠를 제공할 포트
  • random-seed (반드시 변경하세요!)
    • 모든 웹 서버가 동일한 텍스트를 갖지 않도록 하는 데 사용되는 전역 시드(솔트)
    • 임의의 숫자로 설정하세요. 보안 관련 값일 필요는 없습니다.
  • document-root (기본값 "/")
    • 링크 앞에 경로를 추가합니다.
    • 리버스 프록시를 사용하고 하위 디렉터리로 제공하는 경우에만 이 값을 변경하면 됩니다.
      • 이 경우 정규화된 경로 또는 루트 기준 상대 경로를 사용하세요.
        • 예: https://example.com/pyison/ 또는 /pyison/
  • fake-image-dir (기본값 ["images"])
    • 모든 이미지가 이 경로에서 제공되는 것처럼 표시됩니다.
    • 단일 문자열, null 또는 무작위로 선택할 옵션 목록을 허용합니다.
  • fake-css-dir (기본값 ["css"])
    • 모든 CSS 파일이 이 경로에서 제공되는 것처럼 표시됩니다.
    • 단일 문자열, null 또는 무작위로 선택할 옵션 목록을 허용합니다.
  • spacing-characters (기본값 ["_","-","%20"])
    • 페이지 URL의 단어 사이에 사용할 공백 문자
    • 이 값은 페이지 URL을 분할하여 제목으로 다시 디코딩하는 방식에도 영향을 줍니다.
  • unsafe-characters (기본값 ["'","`"])
    • 단어 목록에 자연스럽게 나타날 수 있지만 URL에서 제거해야 하는 문자

HTML 템플릿

  • Pyison은 HTML 파일을 제공하기 전에 일부 사전 설정된 태그를 자체 값으로 대체합니다.

    정적 값

    템플릿에 이러한 태그 중 하나가 여러 번 지정되면 각 값은 동일합니다.
    • {HOME}
      • 구성에 정의된 문서 루트에 대한 링크
    • {TITLE}
      • 현재 URL을 기반으로 한 페이지의 제목 텍스트
        • 예: /blog/about/once-upon-a-time -> Once Upon A Time
    • {UPTITLE}
      • 현재 URL에서 생성된 상위 페이지의 제목 텍스트
    • {MAIN}
      • 사이트의 주요 콘텐츠로 사용해야 합니다. 무작위 텍스트가 포함된 여러 단락과 섹션 제목 및 하위 제목을 생성합니다. 각 단락 전체에 무작위 링크도 포함될 수 있습니다.
    • {UP}
      • 상위 페이지로의 경로
      • 예: /blog/about/once-upon-a-time -> /blog/about
    • {CSSLINK}
      • CSS 문서에 대한 무작위 URL
      • 이 URL의 시작 경로(예: /styles)는 구성에서 설정할 수 있습니다.
    이러한 태그가 나타날 때마다 고유한 값으로 대체됩니다.

이미지

Pyison 로고. 입자가 거친 회색 배경의 가로 방향 직사각형 이미지. 이미지 상단 1/3 중앙에는 짙은 빨간색 텍스트 그림자가 있는 붓글씨체의 밝은 녹색 텍스트가 있으며 'Pyison'이라고 쓰여 있습니다. 하단 근처에는 각진 흰색 텍스트로 'This is a tar pit for AI webcrawlers'라고 쓰여 있습니다. 자세히 보면 이미지 전체에 JPEG 압축 아티팩트가 보입니다.

템플릿을 수정하기 전 사이트의 모습을 보여주는 샘플입니다:

전체 Pyison 페이지를 축소해 본 이미지. 밝은 노란색 배경에 검은색 텍스트를 사용합니다. 페이지 맨 위에는 무작위 단어가 포함된 링크가 있는 녹색 내비게이션 바가 있습니다. 내비게이션 바 아래에는 'Home' 제목과 'Pyison: This is a tar pit for AI webcrawlers'라고 쓰여 있는 로고 이미지가 있습니다. 이미지 아래에는 다양한 들여쓰기 수준의 제목이 있는 무작위 단어로 구성된 여러 단락이 있으며, 이 단락들이 페이지의 대부분을 차지합니다. 단락 내 일부 텍스트는 다른 페이지로 연결되는 링크입니다. 페이지 하단 근처에는 또 다른 Pyison 로고가 있는 가짜 작성자 소개가 있습니다. 소개에는 'Written by It'S An'이라고 쓰여 있습니다. 그 아래에는 여러 개의 링크가 더 있는 'Other Posts' 섹션이 있습니다.
도구 다운로드
root@kitploit:~
services:
  pyison:
    image: "ghcr.io/jonaslong/pyison:main"
    container_name: pyison
    tty: true
    ports:
      - 80:80
  • docker compose up
    • (선택 사항) -d 플래그를 사용하여 컨테이너에서 분리합니다.
  • 로컬 파일 변경 사항을 적용하려면 이 저장소를 클론하고 바인드 마운트를 사용하세요. 전체 compose 파일을 참조하세요.
  • docker run 사용

    • docker run --tty --name pyison -p "127.0.0.1:80:80" --rm ghcr.io/jonaslong/pyison:main
      • (선택 사항) --rm 플래그를 제거하여 컨테이너를 유지합니다.

    소스에서 빌드

    • 저장소를 로컬에 클론합니다.
    • docker build -t pyison:latest .
    • 다음 명령으로 컨테이너를 실행합니다: docker run --tty --name pyison -p "127.0.0.1:80:80" --rm pyison:latest
    location ~ .*\/tar\/pit\/.*\....$
  • 프록시에서 사용하는 하위 경로로 Pyison의 document-root 설정을 업데이트하세요(구성 섹션 참조).
  • 호스트, 포트, SSL 등 추가 구성은 위 섹션을 참조하세요.
  • 기본적으로 이 설정은 아포스트로피(`)와 작은따옴표(')를 제거합니다.
  • robots-txt (기본값 "assets/robots.txt")
    • /robots.txt에서 제공되는 파일을 구성합니다.
    • 문자열이 비어 있으면 대신 404 응답이 반환됩니다.
  • html-templates (기본값 ["assets/template.html"])
    • 제공할 HTML 파일로, 무작위 값을 제공할 형식 텍스트가 포함되어 있습니다(HTML 템플릿 참조).
    • 단일 문자열 또는 무작위로 선택할 옵션 목록을 허용합니다.
  • css-files (기본값 ["assets/style.css"])
    • 제공할 CSS 파일
    • CSS 파일에는 치환이 수행되지 않습니다.
    • 단일 문자열 또는 무작위로 선택할 옵션 목록을 허용합니다.
  • images
    • ico (기본값 ["assets/logo.ico"])
    • jpg (기본값 ["assets/logo.jpg"])
    • png (기본값["assets/logo.png"])
    • 위의 각 이미지 확장자에 대해: 단일 이미지 파일, null 또는 무작위로 선택할 이미지 목록
  • remove-from-stop-words
    • nltk 라이브러리에는 많은 일반적인 단어를 생성하는 데 유용한 '불용어(stop words)' 목록이 있습니다. 그러나 일부 항목은 생성된 콘텐츠임을 명백히 드러내는 표시가 되므로 텍스트 생성에 사용하지 말아야 합니다.
  • 태그 바로 뒤에 '.css'를 지정해야 합니다. 이렇게 해야 웹 서버가 추가 HTML이 아닌 CSS를 전송할 수 있습니다.
    • 서버가 반환하는 실제 문서는 구성에 지정된 CSS 페이지를 기반으로 선택됩니다.
  • 동적 값

    • {WORD}
      • 단일 무작위 단어를 생성합니다. 고유명사는 대문자로 표기될 수 있습니다.
    • {NAME}
      • 공백으로 구분된 두 개의 대문자로 시작하는 단어를 생성합니다.
    • {SENTENCE}
      • 대문자로 시작하고 마침표로 끝나는 무작위 문장을 생성합니다.
    • {PIC}
      • 이미지 파일에 대한 무작위 URL을 생성합니다.
      • 이 URL의 시작 경로(예: /images)는 구성에서 설정할 수 있습니다.
      • 링크 뒤에 적절한 파일 확장자(.png, .jpg, .ico)를 넣어야 합니다.
        • 서버가 반환하는 실제 이미지는 제공된 확장자와 구성에 지정된 이미지를 기반으로 선택됩니다.
    • {LINK}
      • 하위 경로를 포함할 수 있는 무작위 링크를 생성합니다.
      • 페이지 이름은 대시 또는 밑줄로 구분될 수 있습니다.
      • 예: /dressage/electrochronometer/himself-she-eciliate
    • {OVER}
      • 형제 페이지에 대한 무작위 링크를 생성합니다.
      • 예: /neighborliness/wont_unhonest를 방문할 때 {OVER} 태그는 /neighborliness/hooliganism으로 대체될 수 있습니다.
    • {NEWTITLE}
      • 무작위 제목을 생성합니다.
      • 제목 대문자 표기(Title Capitalization)의 일련의 무작위 단어를 사용합니다.
      • 예: Nectarial Electrofusion Which Dephosphorization
      • 이 태그가 {LINK} 또는 {OVER} 태그 뒤에 오면 제목과 URL이 동기화됩니다.
        • 예: <a href="https://github.com/jonaslong/pyison/blob/main/%7BOVER%7D">{NEWTITLE}</a>는 <a href="https://github.com/jonaslong/pyison/blob/main/swordmanship/yeller/over-will-oghuz">Over Will Oghuz</a>로 대체될 수 있습니다.
        • 태그는 템플릿을 통해 앞으로 평가됩니다. {NEWTITLE} 태그는 동기화할 가장 가까운 {LINK} 또는 {OVER} 태그를 역방향으로 검색합니다.
          • {NEWTITLE}이 필요한 경우 {LINK} 또는 {OVER} 태그 바로 뒤에 해당 태그가 오면 태그는 항상 올바르게 쌍을 이룹니다.
    {NEWTITLE}