본문 바로가기

서버

SEO 클로킹 당한 내용 정리(리다이렉트 해킹)

728x90

한 줄 요약:

Build Time이 아닌 Runtime때 발생한 침투인것 같다고 생각.

파일 업로드, nginx쪽 보안 강화함.

 

readonly로 컨테이너 올리면

예상 시나리오를 막을 수 있다



상황: 

운영 중인 사이트가 다음과 같은 케이스로 진입시 리다이렉트 되며 특정 도박(?) 사이트로 진입한다.

 

1) PC로 구글링하여 진입시 -> CSS만 깨짐

2) 모바일폰으로 구글링하여 진입시 -> 아래 주소로 리다이렉트됨

https://456wincc.mm456win.com

 

해커가 관리자는 파악 못하도록 모바일만 리다이렉트 처리하도록 한 거 같다. 


 

원인파악)

1) nginx의 conf 파일 문제없음

2) 프론트 컨테이너 내부 파일 소스 확인

-> 여기서 Titan, dd라는 파일이 루트 디렉토리에 있었음

 

당시 vi로만 확인하고 정확한 소스를 기록을 못함. 

Titan은 javascript소스 였고 ddd는 디코딩이 안되어 문자를 읽을 수 없었음.

3) 빌드는 최근에 한 적 없어서 빌드타임 때 라이브러리 취약점으로 인해 발생한것 같지 않음

4) ssh 침투 흔적 없어보임(그래도 보안 강화함..)

 

결국에는 Build Time이 아닌 Runtime때 발생한 침투인것 같다고 생각함.

파일 업로드, nginx쪽 보안 강화함


[해결시도]

Titan, ddd 파일이 있는 컨테이너만 재시작하니 이상이 없었다. 

그러나 파일 자체가 투입된거는 백도어가 있다라고 판단이 되어 서버 자체에 보안을 심화시켜야 된다고 생각해 실행.

 

1. 성공한 로그기록 확인

last | head -20

 

 

모두 내 계정이라 SSH로 직접 접근 한 건 아닌 것 같음

 

2. 의존하고 있는 패키지 중 하나가 해킹 당해 내 프로젝트 까지 영향을 미친 것. 

# --- Build stage ---
FROM node:22-alpine AS builder
WORKDIR /app

# 1) lockfile 기준으로 의존성 고정
COPY package.json package-lock.json ./
RUN npm ci --ignore-scripts

# 2) 소스 복사 후 빌드
COPY . .
RUN npm run build

# --- Run stage ---
FROM node:22-alpine
WORKDIR /app

# non-root 유저
RUN addgroup -S app && adduser -S app -G app
USER app

# 런타임에 필요한 것만 복사
COPY --from=builder /app/package.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public

ENV NODE_ENV=production
EXPOSE 3000

CMD ["npx", "next", "start", "-p", "3000"]

 

 

3. 최근에 빌드한 적이 없는데 컨테이너 내에 파일이 추가된 것임. 빌드타임 때 해킹 당한게 아니라 

RCE (Remote Code Execution)를 당했을 가능성이 높다.

 

RCE를 통해 SEO 클로킹/JS 인젝션 한 가능성이 높다.

 

따라서 아래 내용을 진행함

- 컨테이너 올릴 때 read-only

- 컨테이너 파일시스템 사용할 수 있는 디렉토리 제한

- nginx 설정파일 수정

  • client_max_body_size
  • header size 제한
  • 비정상 path 차단

 

 

[front 컨테이너]

docker run -d \
  --read-only \
  --tmpfs /tmp \
  --cap-drop ALL \
  -p 3000:3000 \
  front-image

 

 

[back 컨테이너]

docker run -d \
  --read-only \
  --tmpfs /tmp \
  --cap-drop ALL \
  -p $PORT:$PORT \
  --network $NETWORK \
  -v $(pwd)/uploads:/uploads:rw \
  --name $CONTAINER_NAME \
  $IMAGE_NAME

 


공격자가 침투한 예상 경로

[외부 공격자]
   ↓
Spring 파일 업로드 API 발견
   ↓
파일명에 ../ 포함한 악성 업로드
   ↓
Spring 컨테이너에서 임의 파일 생성
   ↓
Docker 네트워크 통해 프론트 컨테이너 접근
   ↓
프론트 런타임 JS 변조 + Titan 드롭
   ↓
모바일 + 구글 조건부 리다이렉트

 

1. 스프링 컨테이너에 업로드시에 Node 스크립트를 주입

2. 아래와 같은 코드로 진행했을 거라고 예상

curl http://localhost:3000
# 어 컨테이너 있다
fs.writeFileSync("Titan", payload)
# 파일 심기

 

따라서 readonly로 컨테이너 올리면

예상 시나리오를 막을 수 있다