stuff and things.. it mostly works.

This commit is contained in:
David Bryan 2019-10-28 06:30:52 +00:00
parent e8ce3159ec
commit 6cb1ee44e3
5 changed files with 164 additions and 17 deletions

View file

@ -3,10 +3,9 @@
# this script will install proxmark3-rdv4, and all the things. # this script will install proxmark3-rdv4, and all the things.
sudo apt-get update && sudo apt-get -y install --no-install-recommends git ca-certificates build-essential pkg-config \ sudo apt-get update && sudo apt-get -y install --no-install-recommends git ca-certificates build-essential pkg-config \
libreadline-dev gcc-arm-none-eabi libnewlib-dev python3-flask hostapd python3-pip python3-dateutil python3-dateparser libev-dev && \ libreadline-dev gcc-arm-none-eabi libnewlib-dev python3-flask python3-flask-sqlalchemy hostapd python3-pip python3-dateutil python3-dateparser libev-dev gunicorn3 && \
sudo pip3 install --upgrade pip && \ sudo pip3 install --upgrade pip && \
sudo pip3 install datetime && \ sudo pip3 install datetime && \
sudo pip3 install bjoern && \
cd ~ && git clone https://github.com/RfidResearchGroup/proxmark3.git &&\ cd ~ && git clone https://github.com/RfidResearchGroup/proxmark3.git &&\
cd ~/proxmark3/ && git pull && make clean && make all && sudo make install &&\ cd ~/proxmark3/ && git pull && make clean && make all && sudo make install &&\
cd ~/proxmark3-web && \ cd ~/proxmark3-web && \

View file

@ -1,19 +1,21 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
import os, string, subprocess, sys, time import os, string, subprocess, sys, time, random
#import subprocess #import subprocess
from flask import Flask, flash, redirect, render_template, \ from flask import Flask, flash, redirect, render_template, \
request, url_for request, url_for
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime from datetime import datetime
debug=0 debug=1
proxmark3_rdv4_dir='../proxmark3' proxmark3_rdv4_dir='../proxmark3'
proxmark3_rdv4_client=proxmark3_rdv4_dir + '/client/proxmark3' proxmark3_rdv4_client=proxmark3_rdv4_dir + '/client/proxmark3'
logfile = "../card-reads.log" logfile = "../card-reads.log"
db_file="/home/pi/proxmark3.db"
# Setup a dictionary for the serial port types # Setup a dictionary for the serial port types
serial_port_list = { '/dev/tty.usbmodemiceman1', '/dev/ttyACM0' } serial_port_list = { '/dev/tty.usbmodemiceman1', '/dev/ttyACM0' }
@ -34,6 +36,14 @@ def get_card_data(data):
#print('Raw: '+ raw_cardnumber +' Card Number: '+ card_number +' Card format: '+ format_len +' Facility: '+ facility_code ) #print('Raw: '+ raw_cardnumber +' Card Number: '+ card_number +' Card format: '+ format_len +' Facility: '+ facility_code )
return(card_data) return(card_data)
def log_card_data(card_data):
if debug:
print("Writing date to the database...")
print(card_data)
addCard = card_tbl(card_raw=card_data['raw_cardnumber'], card_number = card_data['card_number'], card_format = card_data['format_len'], card_oem = card_data['oem'], card_facility_code = card_data['facility_code'])
db.session.add(addCard)
db.session.commit()
def exists(path): def exists(path):
"""Test whether a path exists. Returns False for broken symbolic links""" """Test whether a path exists. Returns False for broken symbolic links"""
try: try:
@ -55,21 +65,35 @@ while not serial_port:
time.sleep(delay) time.sleep(delay)
if(True): if(True):
app = Flask(__name__, instance_relative_config=True)
# create and configure the app # create and configure the app
# app = Flask(__name__, instance_relative_config=True) app = Flask(__name__, instance_relative_config=True)
#Set up the Database for storing cards
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////' + db_file
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
# Database Classes
class card_tbl(db.Model):
id = db.Column(db.Integer, primary_key=True)
time_stamp = db.Column(db.DateTime, nullable=False,
default=datetime.utcnow)
card_raw = db.Column(db.String(128))
card_number = db.Column(db.String(128))
card_format = db.Column(db.String(128))
card_oem = db.Column(db.String(128))
card_facility_code = db.Column(db.String(128))
def __repr__(self):
return '<card_raw {}>'.format(self.card_raw)
# return "<id(id='%s', time_stamp='%s', card_raw='%s', card_format='%s', card_oem='%s', card_facility_code='%s')>" % (
# self.id, self.time_stamp, self.card_raw, self.card_number, self.card_format, self.card_oem, self.card_facility_code)
app.config.from_mapping( app.config.from_mapping(
SECRET_KEY='djjslekrjgi348gj38fd225u8g', SECRET_KEY=str(random.getrandbits(64))
# DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
) )
# if test_config is None: if not os.path.exists(db_file):
# # load the instance config, if it exists, when not testing db.create_all()
# app.config.from_pyfile('config.py', silent=True)
# else:
# load the test config if passed in
# app.config.from_mapping(test_config)
# ensure the instance folder exists # ensure the instance folder exists
try: try:
@ -115,6 +139,7 @@ if(True):
if(cardnumber.returncode == 0): if(cardnumber.returncode == 0):
if('HID Prox TAG ID:' in cardnumber.stdout.decode('ASCII')): if('HID Prox TAG ID:' in cardnumber.stdout.decode('ASCII')):
card = get_card_data(cardnumber.stdout.decode('ASCII')) card = get_card_data(cardnumber.stdout.decode('ASCII'))
log_card_data(card)
if(debug): print("Card number:" + str(card)) if(debug): print("Card number:" + str(card))
current_time=str(datetime.now().isoformat(timespec='seconds')) current_time=str(datetime.now().isoformat(timespec='seconds'))
print(current_time + ' _Card Used_ ' + str(card), file=open(logfile, "a")) print(current_time + ' _Card Used_ ' + str(card), file=open(logfile, "a"))
@ -150,6 +175,19 @@ if(True):
flash('ERROR: CARD DID NOT PROGRAM... TRY AGIAN.') flash('ERROR: CARD DID NOT PROGRAM... TRY AGIAN.')
return redirect(url_for('index')) return redirect(url_for('index'))
@app.route('/card/list')
def card_list():
card = card_tbl.query.all()
#for line in card:
# print(line['card_number'])
return render_template('cards.html', card = card)
@app.route('/card/<card_raw>')
def card_mod(card_raw):
card_raw = card_tbl.query.filter_by(card_raw=card_raw).all()
print(card)
return render_template('card.html', card_raw = card)
@app.route('/wipe_card') @app.route('/wipe_card')
def wipe_card(): def wipe_card():

94
templates/cards.html Normal file
View file

@ -0,0 +1,94 @@
<!doctype html>
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<title>Cards Captured</title>
<body class="bg-dark">
{% include "nav.html" %}
<div class="container-fluid">
<div class="row border">
<div class="col-md-2 py-5">
<img class="img-fluid" src="/static/images/X-Force_Red_Logo_For_Dark_Backgrounds.png">
</div>
</div>
<div class="row text-white border">
<div class="col border">
Action:
</div>
<div class="col border">
Facility Code:
</div>
<div class="col border">
Card Number:
</div>
<div class="col border">
Raw HID Formated Card:
</div>
<div class="col border">
OEM Code:
</div>
</div>
{% for row in card %}
<div class="row text-white border p-1">
<div class="col">
<form action="/write" method="get">
<input type="hidden" name="raw_cardnumber" value={{ row['card_raw'] }} />
<button type="submit" class="btn btn-primary">Clone</button>
</form>
</div>
<div class="col">
{{ row['card_facility_code'] }}
</div>
<div class="col">
{{ row['card_number'] }}
</div>
<div class="col">
{{ row['card_raw'] }}
</div>
<div class="col">
{{ row['card_oem'] }}
</div>
</div>
{% endfor %}
</div>
<div class="row">
<div class="col text-white">
<p>
{% with messages = get_flashed_messages() %}
{% if messages %}
Status:
{% for message in messages %}
{{ message }}
{% endfor %}
{% endif %}
{% endwith %}
&nbsp;
</p>
</div>
</div>
</div>
<div class="row">
<div class="col">
<hr style="border-color: #fff;">
</div>
</div>
<div class="row">
<div class="col">
<a href="/provision_card" type="button" class="btn btn-danger btn-lg">CREATE X-Force Red Card</a>
</div>
<div class="col text-center">
<a href="/wipe_card" type="submit" class="btn btn-warning btn-lg" formaction="/wipe_card">Wipe Card</a>
</div>
<div class="col text-right">
<a href="/" type="submit" class="btn btn-secondary btn-lg" formaction="/">RESTART</a>
</div>
</div>
</div>
<!-- I am a code comment. I have a Key for you. 2005FFFFFF. -->
</body>

View file

@ -3,10 +3,11 @@
<title>XFR-Card-Cloning-Demo</title> <title>XFR-Card-Cloning-Demo</title>
<body class="bg-dark"> <body class="bg-dark">
{% include "nav.html" %}
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-md-4 py-2"> <div class="col-md-2 py-2">
<img class="img-fluid" src="/static/images/X-Force_Red_Logo_For_Dark_Backgrounds.png"> <img class="img-fluid" src="/static/images/X-Force_Red_Logo_For_Dark_Backgrounds.png">
</div> </div>
</div> </div>

15
templates/nav.html Normal file
View file

@ -0,0 +1,15 @@
<nav class="navbar navbar-expand-sm fixed-top navbar-light bg-light">
<div class="container">
<a class="navbar-brand" href="/">Main</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar1">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbar1">
<ul class="navbar-nav nav nav-fill w-50">
<li class="nav-item">
<a class="nav-link active" href="/card/list">CardList</a>
</li>
</ul>
</div>
</div>
</nav>