Wer löst Google reCaptcha?
Wie füllt man seinen Posteingang mit Spam? Einfach ein Kontaktformular ohne Captcha erstellen!
Bestimmt ist dir das Anti-Bot Formular reCaptcha von Google schon begegnet, oder? Und hat es dich jemals davon abgehalten, automatisch Informationen von einer Website zu sammeln? Google Captcha kann maschinell umgangen werden, doch dafür gibt es nur ein paar Möglichkeiten – und nicht alle davon sind geeignet oder zielführend. Es gibt jedoch eine Lösung… und du wirst vielleicht überrascht sein, wie wenig überraschend sie ist. Wer löst also Google reCaptcha?
Wer schon einmal automatisch Daten von einer Website oder Web-App ohne öffentliche API verarbeiten musste, hat höchstwahrscheinlich einen Browser wie PhantomJS, CasperJS oder Cypress eingesetzt. Damit ging alles gut, bis im Anmeldedialog ein reCaptcha (Captcha von Google) auftauchte. Was nun?
Auf die Frage nach einer Lösung schlägt Google selbst folgende Möglichkeiten vor, um das reCaptcha zu umgehen:
- Die Audioversion für Menschen mit Sehbehinderung zweckentfremden (ja, tatsächlich).
- Proxy-Server wechseln und hoffen, dass beim ersten Versuch kein Popup mit dem Titel „Wählen Sie alle Felder mit einer Palme aus“ erscheint.
- Nutzen Sie Human Captcha Solver (Wie bitte?!).
Gehen wir die Optionen und möglichen Lösungen einmal kurz durch.
1) Audio-Bypass
Kurzbeschreibung der Lösung:
- Wir gehen auf die Anmeldeseite.
- Wir geben die Login-Daten ein.
- Wir klicken auf Captcha.
- Aus der DOM-Struktur ermitteln wir den Pfad zur Audiodatei.
- Wir schicken unseren Webdienst zum angegebenen Link mit der Audiodatei, er lädt sie herunter, lässt sie durch ReBreakCaptcha laufen und sendet sie als Text zurück, den wir dann in das Captcha eingeben.
- Und wir senden das Formular!
Wo liegt das Problem? Mit seiner Veröffentlichung im Jahr 2016 wurde das Projekt ReBreakCaptcha weltweit bekannt und Google reagierte darauf. In der Folge schrieb der Projektautor am 3. März 2017 als letztes Update, dass das Projekt die Sprachnachrichten von Google nicht mehr entschlüsseln kann.
2) Proxy, VPN
... einfach – nein. 🙂 Der Einsatz von Proxy oder VPN kann das Risiko, dass der Authentifizierungsdialog erscheint, verringern, löst jedoch das Problem an sich nicht. Darüber hinaus erfordert diese Methode den Einsatz einer Vielzahl privater Proxy-Server oder privater VPN-Netzwerke.
3) Human Captcha Solver!
Ehrlich gesagt war ich – vermutlich genau wie du – überrascht, das Wort „human“ im Zusammenhang mit einer Captcha-Lösung zu finden. Der Name ist kein Scherz, sondern Programm. Die Captcha wird nicht von einem neuronalen Netzwerk oder einem ausgeklügelten Algorithmus gelöst, sondern von einem echten Menschen, der auf der anderen Seite des Planeten sitzt.
Was ist CAPTCHA eigentlich?
Blicken wir einmal zurück in die Vergangenheit: Die erste Form der Captcha wurde im Jahr 2000 „erfunden“. Der Begriff CAPTCHA ist ein Akronym für „Completely Automated Public Turing Test to tell Computers and Humans Apart“. Das Ziel ist also klar definiert: Computer (Turing-Maschine) und Mensch unterscheiden. Es ist erwähnenswert, dass beim Captcha die Rollen im Vergleich zum ursprünglichen Turing-Test vertauscht sind. Derjenige, der das Ergebnis auswertet, ist ein Computer und kein Mensch.
Google hat den ursprünglichen Zweck erweitert und versucht, auch Nebeneffekte des Tests zu nutzen. Die Ergebnisse von reCaptcha werden zur Identifizierung von Objekten, zur Texterkennung (z. B. zum Lesen von Verkehrsschildern), zur Kommentierung von Bildern oder zur Übersetzung von Büchern verwendet. Ein gutes Beispiel für diese Nutzung ist Google Translate. Machen mit deinem Handy ein Foto von einem Stück Papier mit einem Text und Google transkribiert diesen in ein Textfeld. Leider gibt es wahrscheinlich niemanden, der über einen so umfangreichen Datensatz wie Google verfügt, weshalb es notwendig ist, einen Menschen in unseren automatisierten Prozess einzubeziehen.
2Captcha hilft!
Ich stelle nun einen Dienst vor, der dir helfen kann. 2Captcha ist ein Dienst zur automatischen Erkennung von Tests, die gegen Bots konzipiert sind. Die Captchas werden jeweils – Überraschung – von Menschen gelöst.
Wir sind mit unseren Jobs recht zufrieden, deshalb interessiert es uns viel mehr, wie viel wir für 1.000 gelöste Captchas bezahlen. Das wären dann 3 $.
Auf zum Code
Ganz ohne Arbeit geht es nicht. Um Captcha zu knacken, brauchen wir neben dem zuvor genannten Dienst auch JavaScript. Im Folgenden kannst du einen Blick auf ein Beispiel aus dem Quellcode werfen. Für alle, die kein JavaScript mögen oder heute Morgen noch keinen Kaffee getrunken haben, fasse ich den Ablauf kurz in Stichpunkten zusammen. Hier zunächst der Code.
// API key
// https://2captcha.com/enterpage
const API_KEY = 'XXXX';
// Find site key of a website
const googleSiteKey = document.getElementsByClassName('g-recaptcha')[0].getAttribute('data-sitekey');
// Helper parsing function const extractTextFromResponse = response => response.status === 200 ? response.text().then(text => text) : false;
// Helper delay function const delay = value => new Promise(res => setTimeout(res, value));
// Function for sending captcha we want to solve to the API async function sendCaptcha() {
const captchaDataString = [
'key=' + API_KEY,
'method=userrecaptcha',
'googlekey=' + googleSiteKey,
'pageurl=' + window.location.href,
].join("&");
return await fetch('https://2captcha.com/in.php?' + captchaDataString)
.then(payload => extractTextFromResponse(payload))
.then(payload => {
if (!payload || payload.substr(0, 2) !== "OK") {
console.error("Payload is not okay", payload);
return false;
}
return payload.substr(3);
})
.catch(error => {
console.error("Something went wrong", error);
return false;
})
}
// Function that waits for a response
async function poolResponse(requestId, counter = 0,
counterLimit = 3, waitTime = 20000, decrementWaitTimeBy = 5000) {
if (counter === counterLimit || waitTime < 0) { console.error("Captcha was not solved in time."); return false;
}
await delay(waitTime - decrementWaitTimeBy); // Wait some time
const dataStringRes = [
'key=' + API_KEY,
'action=GET',
'id=' + requestId,
'json=0'
].join("&");
return fetch('https://2captcha.com/res.php?' + dataStringRes)
.then(payload => extractTextFromResponse(payload))
.catch(error => {
console.error("Something went wrong", error);
reject(false);
});
}
// Start function
(async function () {
// Get request id of current captcha
const requestId = await sendCaptcha();
if (!requestId) {
return false;
}
// Wait for somebody to solve your captcha const
counterLimit = 3;
for (let i = 0; i < counterLimit; i++) {
const payload = await poolResponse(requestId, i, counterLimit);
if (payload === "CAPCHA_NOT_READY") {
continue;
}
if (!payload || payload.substr(0, 2) !== "OK") {
console.error("Captcha was not solved.", payload); return false;
}
// Save
document.getElementById("g-recaptcha-response").innerHTML = payload; break;
}
})();
Und nun der Ablauf. Wir brauchen lediglich ein paar einfache Schritte.
- Wir finden den Site-Key (Public Key) heraus, den die Website zur Anzeige von Captcha verwendet. (Der Secret Key/Private Key wird dann von der jeweiligen Seite für die verschlüsselte Kommunikation mit dem Google-Server verwendet, um zu überprüfen, ob das Captcha erfolgreich gelöst wurde.)
- Diese Daten senden wir an die API des Dienstes http://2captcha.com und warten auf die Antwort.
- Die Antwort erfolgt im Format
STATUS|REQUEST_ID.
- Bei
STATUS == 'OK'
warten wir 20 Sekunden. Danach fragen wir, ob die Captcha schon durch eine Arbeitskraft gelöst wurde. - Die Antwort ist entweder
CAPCHA_NOT_READY
oderSTATUS|RESPONSE_HASH
. - Beim Status
CAPCHA_NOT_READY
warten wir noch einmal die Hälfte der Zeit und wiederholen die Aktion, maximal drei Mal. - Wenn wir eine positive Antwort erhalten, speichern wir sie im DOM und senden das Formular ab.
CAPTCHA den Menschen überlassen
In diesem Artikel haben wir 2 Dinge aufgezeigt. Erstens, wie einfach es ist, das allgegenwärtige Google reCaptcha zu umgehen, und zweitens, dass es am besten ist, ein menschliches Gehirn dafür zu benutzen. Der umgekehrte Turing-Test wird am besten von dem gemeistert, für den er entwickelt wurde – vom Menschen.