mirror of
https://github.com/videoman/proxmark3-web.git
synced 2024-12-27 09:53:06 +08:00
stuff and things.. it mostly works.
This commit is contained in:
parent
e8ce3159ec
commit
6cb1ee44e3
5 changed files with 164 additions and 17 deletions
|
@ -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 && \
|
||||||
|
|
|
@ -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
94
templates/cards.html
Normal 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 %}
|
||||||
|
|
||||||
|
</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>
|
|
@ -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
15
templates/nav.html
Normal 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>
|
Loading…
Reference in a new issue