소개
Fieldnote는 Northline Print Fair를 준비하고 있습니다. 출품자는 로그인하여 자신의 부스 자료를 받습니다. 자료에는 도착 시간, 배송 지점, 포장 목록이 들어 있습니다. 첫 Hydra 테스트는 사용할 수 있는 로그인을 여러 개 찾은 것처럼 보입니다. 하지만 일부 결과는 실제로 오류 페이지입니다. 여러분의 일은 실제 인증과 오해를 부르는 응답을 구분한 뒤 지정 출품자의 전체 자료를 가져오는 것입니다.
기본적인 터미널 입력, 경로 이해, 탭 전환만 알면 됩니다. Hydra와 로컬 포털은 준비되어 있습니다. 폼 필드, 일치 조건, 쿠키 처리는 사용하기 전에 설명합니다. Workstation은 터미널이고 Exhibitor Portal은 웹사이트입니다. 두 호스트가 아니라 하나의 격리된 교육용 컨테이너에 접근하는 두 인터페이스입니다. 모든 계정과 업무 데이터는 합성 자료입니다. 제공된 후보만 사용하여 명시된 연습 폼과 지정 계정만 테스트하세요. 서버, 계정, 문서를 변경하지 마세요.
예상 시간 55분에는 읽기와 일반적인 오류 처리가 포함되며 초보자를 대상으로 측정한 시간이 아닙니다. 결과물은 재사용 가능한 폼 인수, 원본 Hydra 결과, 인증하여 받은 부스 자료이며 서술형 보고서가 아닙니다.
실제 로그인으로 열리는 화면 확인하기
이 단계에서는 작동이 확인된 미리 보기 계정을 열고 그 계정 자신의 부스 정보와 연결합니다. HTTP 요청의 성공은 서버가 응답을 보냈다는 뜻입니다. 인증의 성공은 서버가 특정 계정의 신원을 받아들였다는 뜻입니다. 둘은 서로 다른 사실입니다.
Exhibitor Portal 탭을 여세요. Start at the practice desk를 선택한 뒤 Practice sign-in을 선택합니다. 출품자 ID preview와 비밀번호 Preview24를 입력하고 Sign in을 선택하세요. 결과에는 Signed in as preview가 표시됩니다. Open your workspace를 선택합니다. 부스는 DEMO이고 포장 메모에는 연습용 문서라고 표시됩니다. 이것이 정상적인 업무 흐름입니다. 이 미리 보기 자료는 최종 과제의 결과물이 아닙니다. Sign out을 선택한 뒤 탐색 메뉴의 Practice desk를 선택하세요.

출품자 ID와 부스를 보면 미리 보기 문서임을 알 수 있습니다. 다운로드 버튼이 있다는 사실만으로 지정 자료라고 증명되지는 않습니다.
Workstation으로 전환하세요. 이 랩의 명령은 /home/labex/project/login-review에서 시작합니다. 인터페이스는 자동으로 이 디렉터리에 들어갑니다. pwd는 현재 디렉터리를 출력하므로 위치를 확인할 수 있습니다.
pwd
/home/labex/project/login-review가 나와야 합니다. 다른 곳에 있다면 cd로 디렉터리를 변경합니다.
cd /home/labex/project/login-review
연습 로그인 폼은 /practice/login에 POST 요청을 보냅니다. POST는 이름이 붙은 필드를 요청 본문으로 전달합니다. 여기서는 필드 이름이 username과 password이며 &로 구분됩니다. curl은 브라우저와 독립적으로 터미널에서 요청을 보냅니다. 다음 명령에서 --data는 필드를 제공하고, -s는 진행 표시를 숨기고, -o는 응답 본문을 저장하고, -w는 HTTP 상태를 출력합니다. 작은따옴표는 공백, &, %{http_code}를 curl에 전달할 내용으로 묶어 셸이 해석하지 못하게 합니다.
의도적으로 잘못된 비밀번호를 한 번 보냅니다.
curl -s -o wrong.html -w 'HTTP %{http_code}
' --data 'username=preview&password=Wrong24' http://127.0.0.1:8080/practice/login
출력은 HTTP 200입니다. 이는 애플리케이션이 페이지를 반환했다는 뜻이지 비밀번호가 맞았다는 뜻이 아닙니다. wrong.html에 그 페이지가 들어 있습니다. grep은 텍스트를 검색하며 -o 옵션은 일치한 텍스트만 출력하므로 주변 HTML 마크업을 읽을 필요가 없습니다.
grep -o 'Incorrect password' wrong.html
Incorrect password가 나와야 합니다. 같은 HTTP 상태가 실제 성공과 거부된 로그인을 모두 나타낼 수 있습니다. 이 수업에서 일반적인 비밀번호 오타는 복구할 수 있습니다. 값을 고쳐 다시 제출하면 됩니다. 연결 오류는 요청이 서비스에 도달하지 못했다는 뜻입니다. 로그인 결과를 해석하기 전에 127.0.0.1, 포트 8080, 명시된 경로를 확인하세요. 오타 때문에 VM을 초기화하지 마세요.
오해를 부르는 탐지 결과 재현하기
이 단계에서는 작은 연습용 네 쌍에 의도적으로 잘못된 분류 규칙을 실행합니다. 이것은 잘못된 테스트의 시연이지 신뢰할 수 있는 감사가 아닙니다.
Workstation에 머무르세요. cat은 파일을 표시합니다. 준비된 목록에는 완전한 username:password 쌍이 한 줄에 하나씩 들어 있습니다.
cat practice-pairs.txt
preview:Wrong24
retired:Wrong24
offline:Wrong24
preview:Preview24
retired는 사용할 수 없는 계정의 합성 예시입니다. offline은 제어된 서비스 오류 예시로, 연습 처리기가 세션을 만들지 않고 HTTP 503을 반환합니다. 실제 상위 서비스 장애나 실제 출품자가 아닙니다. 마지막 쌍은 작동이 확인된 미리 보기 로그인입니다. 이 작은 허용 집합을 유지하고 임의의 사용자 이름과 비밀번호 조합으로 확장하지 마세요.
Hydra의 http-post-form 모듈은 각 쌍을 폼으로 보냅니다. 인수는 콜론으로 구분되는 세 부분, 즉 POST 경로, 필드, 응답 조건으로 구성됩니다. ^USER^와 ^PASS^는 Hydra 자리표시자입니다. F=는 “이 패턴을 포함한 응답을 실패로 처리한다”라는 뜻입니다. 그 밖의 응답은 성공으로 분류될 수 있습니다. 이 명령은 의도적으로 Incorrect password만 인식하여 다른 실패 유형을 놓칩니다.
옵션은 이 작업 공간의 오래된 복원 질문을 무시하는 -I, 짝지어진 후보를 지정하는 -C, 포트를 지정하는 -s, 작업자 하나를 사용하는 -t 1, 결과 파일 이름을 지정하는 -o, JSON 출력을 선택하는 -b json입니다. 마지막 인수는 따옴표로 묶여 있으므로 공백과 &가 들어 있어도 하나의 인수로 유지됩니다.
hydra -I -C practice-pairs.txt -s 8080 -t 1 -o misleading.json -b json 127.0.0.1 http-post-form '/practice/login:username=^USER^&password=^PASS^:F=Incorrect password'
프로그램을 작성하지 않고 JSON을 읽으려면 Python에 내장된 json.tool 형식화 도구를 사용합니다. python3 -m은 설치된 모듈을 실행합니다.
python3 -m json.tool misleading.json
results 목록을 읽으세요. 작동하는 미리 보기 쌍뿐 아니라 사용할 수 없는 계정이나 서비스 오류의 쌍도 나타날 수 있습니다. 탐지 결과는 조건이 내린 판단일 뿐, 인증된 작업 공간의 증명이 아닙니다. 최상위 success: true는 Hydra의 실행 상태를 나타내며 보고된 비밀번호가 모두 유효하다는 뜻이 아닙니다. 이 잘못된 파일을 최종 감사 결과로 사용하지 마세요.
Hydra가 구문 또는 연결 오류를 보고하면 따옴표를 포함한 전체 인수와 포트를 위 명령과 비교하고 오타를 고친 뒤 이 제한된 연습 테스트를 다시 실행하세요. 연결 실패는 작동하는 비밀번호도, 유효한 미발견 결과도 입증하지 못합니다.
알려진 응답으로 조건 조정하기
이 단계에서는 실제 성공은 받아들이고 알려진 세 가지 비성공 사례는 모두 거부하는 재사용 가능한 조건을 저장합니다. Workstation에서 같은 요청 형식으로 다른 응답부터 살펴봅니다.
사용할 수 없는 계정 요청은 의도적으로 HTTP 200을 반환합니다.
curl -s -o retired.html -w 'HTTP %{http_code}
' --data 'username=retired&password=Wrong24' http://127.0.0.1:8080/practice/login
grep -o 'Sign-in unavailable' retired.html
제어된 서비스 오류 요청은 의도적으로 HTTP 503을 반환합니다. 페이지에 Incorrect password가 없더라도 유효한 세션은 없습니다.
curl -s -o offline.html -w 'HTTP %{http_code}
' --data 'username=offline&password=Wrong24' http://127.0.0.1:8080/practice/login
grep -o 'Service unavailable' offline.html
이제 성공이 확인된 응답을 가져옵니다. 이 curl 요청의 세션은 브라우저와 별개입니다.
curl -s -o preview.html --data 'username=preview&password=Preview24' http://127.0.0.1:8080/practice/login
grep -o 'Signed in as preview' preview.html
여기서는 Signed in as가 인증된 결과를 나타냅니다. Welcome은 실패 페이지에도 나타나므로 인증을 구분할 수 없습니다. Hydra의 S=는 성공을 나타내는 패턴을 선택합니다. 응답이 그 패턴을 포함해야 성공으로 셉니다. -U로 설치된 모듈 도움말을 확인하세요. 경로, 필드, 조건 구문을 설명합니다.
hydra -U http-post-form
전체 연습 인수를 저장합니다. cat > calibration.txt는 텍스트를 파일에 쓰고 >는 기존 파일이 있으면 교체합니다. 히어 도큐먼트는 종료 줄 EOF까지 여러 줄의 입력을 제공합니다. 'EOF'를 따옴표로 묶으면 본문을 문자 그대로 보존합니다. 종료 표시는 앞에 공백 없이 한 줄에 단독으로 놓으세요.
cat > calibration.txt <<'EOF'
/practice/login:username=^USER^&password=^PASS^:S=Signed in as
EOF
셸 변수는 이 터미널에서 재사용할 텍스트를 저장합니다. $(cat calibration.txt)가 파일을 읽고 form=이 결과를 저장합니다. = 주위에는 공백이 없어야 합니다. 나중에 "$form"을 따옴표로 묶으면 공백을 하나의 인수 안에 유지합니다. 이 변수는 현재 터미널 세션에 속하므로 재연결한 뒤에는 대입을 다시 실행하세요.
form=$(cat calibration.txt)
hydra -I -C practice-pairs.txt -s 8080 -t 1 -o calibration.json -b json 127.0.0.1 http-post-form "$form"
python3 -m json.tool calibration.json
preview:Preview24만 보고되어야 합니다. 잘못된 비밀번호, 사용할 수 없는 계정, HTTP 503은 인증된 것이 아닙니다. 조건 조정에는 알려진 성공 사례도 포함해야 합니다. 모두 거부하는 조건도 틀리기 때문입니다. 충분히 넓은 실패 패턴은 이 성공 패턴과 동등할 수 있으며 특정한 S= 표기를 강제하지 않습니다. 저장된 인수는 단순히 키워드를 포함했다고 받아들여지는 것이 아니라 알려진 응답 각각으로 독립 테스트됩니다.
지정된 출품자의 자료 가져오기
이 단계에서는 조정한 방법을 지정 출품자에게 적용하고 별도로 인증하여 실제 업무 문서를 가져옵니다.
Exhibitor Portal을 열고 Exhibitor sign-in, View your review assignment를 선택합니다. 지정 계정은 papertrail이며 POST 경로는 /signin입니다. candidates.txt에 있는 세 비밀번호만 허용됩니다. 연습 계정은 다른 폼에 속합니다. Workstation으로 전환하여 후보를 읽으세요.
cat candidates.txt
지정 경로에 동일한 필드와 조건을 사용하여 두 번째 재사용 인수를 저장합니다.
cat > form.txt <<'EOF'
/signin:username=^USER^&password=^PASS^:S=Signed in as
EOF
form=$(cat form.txt)
-C와 달리 -l papertrail은 고정 사용자 이름 하나를 지정하고 -P candidates.txt는 그 계정의 허용 비밀번호를 제공합니다. 작은 지정 감사를 실행하고 새로운 원본 JSON 결과를 저장합니다.
hydra -I -l papertrail -P candidates.txt -s 8080 -t 1 -o findings.json -b json 127.0.0.1 http-post-form "$form"
python3 -m json.tool findings.json
유일한 실제 탐지는 papertrail과 비밀번호 InkPaper7입니다. 이 결론은 명시된 계정과 후보 집합에만 적용되며 전체 사이트가 안전하다는 주장이 아닙니다.
Exhibitor Portal로 전환합니다. Exhibitor sign-in을 선택하고 발견한 쌍을 입력한 뒤 Sign in, Open your workspace를 선택하세요. papertrail, 부스 N-14, 도착 09:15, North loading door를 확인합니다. Download booth kit를 선택하여 실제 브라우저 다운로드를 받으세요. 이 파일은 브라우저 다운로드 위치에 저장되며 교육용 컨테이너에 자동으로 나타나지 않습니다.

다운로드를 사용하기 전에 포장 메모 위의 출품자와 부스 필드를 확인하세요.
필요한 VM 내 사본을 저장하려면 Workstation으로 돌아갑니다. 쿠키는 서버가 발급한 세션 식별자입니다. -c exhibitor.cookies는 이 터미널 로그인으로 받은 쿠키를 저장합니다. 이 쿠키 파일은 curl의 것이며 브라우저와 Hydra는 자동으로 공유하지 않습니다. 응답 본문은 signin.html에 저장됩니다.
curl -s -c exhibitor.cookies -o signin.html --data 'username=papertrail&password=InkPaper7' http://127.0.0.1:8080/signin
같은 파일로 인증된 다운로드를 읽습니다. -b는 그 쿠키를 전송합니다. -f는 HTTP 거부 시 0이 아닌 상태를 반환하게 하여 오류 페이지를 자료로 몰래 저장하지 않도록 합니다.
curl -f -s -b exhibitor.cookies http://127.0.0.1:8080/kit.json -o booth-kit.json
403 또는 curl 종료 상태 22는 이 클라이언트에 승인된 세션이 없다는 뜻입니다. 사용자 이름, 비밀번호, 폼 경로, 쿠키 파일 이름을 확인하고 로그인 명령을 다시 실행한 뒤 다운로드를 반복하세요. 404는 잘못된 경로를 뜻합니다. 이런 오류는 복구할 수 있으므로 미리 보기 파일을 복사해 자료 대신 쓰지 마세요.
python3 -m json.tool booth-kit.json
출품자, 부스, 도착 시간을 페이지와 비교하세요. 전체 자료에는 인쇄물 진열대 세 개, 테이블보 두 장, 번호가 있는 인쇄물 보호 슬리브에 대한 메모도 포함됩니다. 파일이 존재하거나 출품자 이름이 맞는 것만으로 문서 전체가 올바르다고 증명되지는 않습니다.
마지막으로 Exhibitor Portal에서 Visitor guide를 여세요. 공개 도착 안내는 계속 이용할 수 있어야 합니다. 변경한 것은 자신의 파일과 세션뿐이며 서비스, 계정, 업무 데이터는 유지됩니다. 최종 결과물은 작업 공간의 form.txt, findings.json, booth-kit.json입니다. 검사는 기존 로그인과 다운로드 사실을 읽고 별도의 일회용 서비스에서 저장된 인수를 테스트합니다. 실제 포털에서 빠진 작업을 대신 채우지는 않습니다.
요약
실제로 인증된 작업 공간을 잘못된 비밀번호, 사용할 수 없는 계정, 서비스 오류 응답과 비교했습니다. Hydra 오탐을 재현하고 성공과 실패 사례 모두로 재사용 가능한 폼 조건을 조정한 뒤 독립된 쿠키 세션으로 지정 계정을 확인하고 전체 자료를 가져왔습니다. HTTP 200, 실행 성공 표시, 일반적인 Welcome 메시지만으로 인증을 입증할 수는 없습니다.



