Initial commit

This commit is contained in:
Rayhan Hanaputra authored and GitHub committed 2025-10-10 22:18:06 +07:00
commit ea02892f14
1246 files changed
+289342

No files matched your search

+1
View File
@@ -0,0 +1 @@
.env
+24
View File
@@ -0,0 +1,24 @@
FROM public.ecr.aws/docker/library/ruby:2.7.2
ARG PASSWORD
RUN echo root:${PASSWORD} | chpasswd
RUN apt-get update && apt-get install -y openssh-server curl
RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
RUN service ssh start
WORKDIR /ctf/art/
RUN useradd -m ctf
RUN chown -R root:root /ctf/art/
COPY Gemfile .
COPY app.rb .
COPY start.sh .
RUN bundle install
RUN touch /flag.txt
RUN chmod +x start.sh
CMD ./start.sh
+4
View File
@@ -0,0 +1,4 @@
source "http://rubygems.org"
gem "sinatra"
gem "slim"
+14
View File
@@ -0,0 +1,14 @@
require "sinatra"
require "slim"
set :port, 8080
set :bind, '0.0.0.0'
set :environment, :production
get '/' do
redirect '/art/gemastik'
end
get '/art/:word' do
return Slim::Template.new{ '<iframe height="100%" width="100%" frameborder="0" src=https://asciified.thelicato.io/api/v2/ascii?text=' + params[:word] + '></iframe>' }.render
end
+11
View File
@@ -0,0 +1,11 @@
version: '3'
services:
art:
restart: always
build:
context: .
args:
- PASSWORD=root
ports:
- "10000:8080"
- "10022:22"
+5
View File
@@ -0,0 +1,5 @@
# run sshd
/usr/sbin/sshd -D &
# run the command
su ctf -c "bundle install"
su ctf -c "ruby /ctf/art/app.rb"
+29
View File
@@ -0,0 +1,29 @@
FROM public.ecr.aws/docker/library/ubuntu:20.04
ARG PASSWORD
ENV DEBIAN_FRONTEND noninteractive
RUN echo root:${PASSWORD} | chpasswd
RUN apt-get update && apt-get install -y openssh-server lib32z1 xinetd cmake gcc curl
RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
RUN service ssh start
RUN useradd -m ctf
WORKDIR /ctf
RUN echo "Connection blocked" > /etc/banner_fail
COPY ctf.xinetd /etc/xinetd.d/ctf
COPY ./src/main.c ./
COPY ./start.sh ./
RUN gcc /ctf/main.c -no-pie -fno-stack-protector -Wl,-z,relro,-z,now -o /ctf/main
RUN touch /flag.txt
RUN chmod -R 755 /ctf
RUN chmod +x /ctf/start.sh
ENTRYPOINT []
CMD ["/usr/sbin/xinetd", "-dontfork"]
EXPOSE 8000
+18
View File
@@ -0,0 +1,18 @@
service ctf
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
type = UNLISTED
port = 8000
bind = 0.0.0.0
server = /bin/sh
server_args = /ctf/start.sh
banner_fail = /etc/banner_fail
# safety options
per_source = 10 # the maximum instances of this service per source IP address
rlimit_cpu = 1 # the maximum number of CPU seconds that the service may use
#rlimit_as = 1024M # the Address Space resource limit for the service
}
+15
View File
@@ -0,0 +1,15 @@
#include <stdio.h>
#include <stdlib.h>
void give_me_idea() {
char buf[64];
puts("Do you have a good idea?");
fgets(buf, 200, stdin);
}
void main() {
setbuf(stdout, NULL);
give_me_idea();
puts("hmm... I'm also think the same thing...");
return 0;
}
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
/usr/sbin/sshd -D &
su ctf -c "/ctf/main"
+27
View File
@@ -0,0 +1,27 @@
FROM public.ecr.aws/docker/library/python:3.11-slim-buster
ARG PASSWORD
WORKDIR /opt
RUN apt-get update
RUN apt-get install -y nano openssh-server \
gcc python-dev python3-dev libgmp3-dev curl
RUN echo root:${PASSWORD} | chpasswd
RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
RUN service ssh start
COPY src/ .
RUN touch /flag.txt
RUN touch /priv.data
RUN pip install -r requirements.txt
RUN python3 database/init.py merricx_number_1_fans ${PASSWORD}
RUN chmod +x ./start.sh
EXPOSE 80
EXPOSE 22
CMD ./start.sh
@@ -0,0 +1,16 @@
version: "3"
services:
burvesigner:
restart: always
container_name: burvesigner
build:
context: ./
args:
- PASSWORD=PASSWORD_14000
ports:
- "14000:80"
- "14022:22"
volumes:
- ./flag.txt:/flag.txt:ro
- ./priv.data:/priv.data:ro
+1
View File
@@ -0,0 +1 @@
PLACEHOLDER
+1
View File
@@ -0,0 +1 @@
PLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDER
@@ -0,0 +1,68 @@
#!/usr/bin/env python3
from Crypto.Util.number import *
from fastecdsa.curve import Curve
from fastecdsa.point import Point
from base64 import urlsafe_b64decode, urlsafe_b64encode
from time import time
from zlib import crc32
class BurveSigner:
def __init__(self):
self.C = Curve(
"burvesigner",
0xDB7C2ABF62E35E668076BEAD208B,
0xDB7C2ABF62E35E668076BEAD2088,
0x659EF8BA043916EEDE8911702B22,
0xDB7C2ABF62E35E7628DFAC6561C5,
0x0E27CD305696E88F38F7EB1FBECE,
0xCAA9A6F90944FAD41FBE02B8FD77,
)
self.t = self.C.p.bit_length() // 8
self.u = self.C.p.bit_length() - 64
self.v = getRandomNBitInteger(self.u)
def from_bytes(self, data):
return int.from_bytes(data, "little")
def to_bytes(self, num):
return int.to_bytes(num, self.t, "little")
def hash(self, msg):
return crc32(msg)
def set_keys(self):
priv = open("/priv.data", "rb").read()[:self.t]
self.x = self.from_bytes(priv)
self.Y = self.x * self.C.G
def get_params(self):
self.set_keys()
return {
"p": self.C.p,
"a": self.C.a,
"b": self.C.b,
"n": self.C.q,
"G": (self.C.gx, self.C.gy),
"Y": (self.Y.x, self.Y.y),
}
def sign(self, msg):
self.set_keys()
k = (int(time() * 1337) << self.u) + self.v
R = k * self.C.G
s = (self.hash(msg) - self.x * R.x) * pow(k, -1, self.C.q) % self.C.q
sig = b"".join(map(self.to_bytes, [R.x, R.y, s]))
return urlsafe_b64encode(sig)
def verify(self, msg, sig):
self.set_keys()
try:
assert len(sig) == 4 * self.t
sig = urlsafe_b64decode(sig)
arr = [sig[self.t * i : self.t * (i + 1)] for i in range(3)]
Rx, Ry, s = map(self.from_bytes, arr)
R = Point(Rx, Ry, self.C)
return self.hash(msg) * self.C.G == s * R + self.Y * R.x
except:
return False
@@ -0,0 +1,11 @@
#!/usr/bin/env python3
import sqlite3
db = "database.db"
con = sqlite3.connect(db)
cur = con.cursor()
cur.execute("SELECT * FROM users")
rows = cur.fetchall()
for row in rows:
print(row)
@@ -0,0 +1,51 @@
#!/usr/bin/env python3
import hashlib
import os
import sqlite3
import sys
db = "database.db"
class User:
def __init__(self, username, password, role):
self.username: str = username
self.password: str = password
self.role: str = role
def main():
try:
os.remove(db)
except:
pass
con = sqlite3.connect(db)
con.execute("CREATE TABLE users (username TEXT, password TEXT, role TEXT)")
def insert_person(person: User):
cur.execute(
"INSERT INTO users (username, password, role) VALUES (?, ?, ?)",
(
person.username,
hashlib.sha256(
b"gema" + person.password.encode() + b"steg"
).hexdigest(),
person.role,
),
)
con.commit()
cur = con.cursor()
admin = User(sys.argv[1], sys.argv[2], "admin")
guest = User("guest", "guest", "guest")
insert_person(admin)
insert_person(guest)
con.close()
if __name__ == "__main__":
if len(sys.argv) != 3:
print(f"Usage: {sys.argv[0]} <username> <password>")
exit()
main()
+113
View File
@@ -0,0 +1,113 @@
#!/usr/bin/env python3
from burvesigner import BurveSigner
from flask import Flask, make_response, render_template, request, flash
from hashlib import sha256
from time import time
import base64
import json
import secrets
import sqlite3
app = Flask(__name__)
app.config["SECRET_KEY"] = secrets.token_hex()
db = "database.db"
signer = BurveSigner()
b64p = lambda x: x + b"=" * (-len(x) % 4)
b64u = lambda x: x.rstrip(b"=")
b64e = lambda x: b64u(base64.urlsafe_b64encode(x))
b64d = lambda x: base64.urlsafe_b64decode(b64p(x))
def generate_token(user, role):
payload = b64e(json.dumps({
"user": user,
"role": role,
"exp": int(time()) + 300
}).encode())
signature = signer.sign(payload)
token = payload + b"." + signature
return token.decode()
def validate_token(token):
assert token.count(".") == 1
payload, signature = token.split(".")
assert signer.verify(payload.encode(), signature.encode())
payload = json.loads(b64d(payload.encode()).decode())
assert payload.get("user") and payload.get("role") and payload.get("exp")
user, role, exp = payload.get("user"), payload.get("role"), payload.get("exp")
assert int(time()) < exp
return [user, role, exp]
def create_response_data(user, role):
data = f"Welcome, {user}! "
if role == "admin":
try:
data += open("/flag.txt").read()
except:
data += "Flag is missing, please contact probset"
else:
data += "Only admin can access the flag"
return data
def get_role(username, password):
connection = sqlite3.connect(db)
cursor = connection.cursor()
cursor.execute(
"SELECT role FROM users WHERE username = ? AND password = ?",
(username, sha256(b"gema" + password.encode() + b"steg").hexdigest()),
)
role = cursor.fetchone()
connection.close()
assert role
return role[0]
@app.route("/params", methods=["GET"])
def params():
return f"<pre>{json.dumps(signer.get_params(), indent=2)}</pre>"
@app.route("/", methods=["POST", "GET"])
def index():
if request.method == "POST":
username = request.form.get("username")
password = request.form.get("password")
try:
assert 2 <= len(username) <= 32
assert 2 <= len(password) <= 32
role = get_role(username, password)
token = generate_token(username, role)
validate_token(token)
response = make_response(render_template(
"index.html",
data=create_response_data(username, role)
))
response.set_cookie("token", token)
return response
except:
flash("Invalid username and/or password")
return render_template("index.html")
else:
token = request.cookies.get("token")
if token:
try:
username, role, _ = validate_token(token)
return render_template(
"index.html",
data=create_response_data(username, role)
)
except:
flash("Invalid token")
return render_template("index.html")
else:
return render_template("index.html")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=80, debug=False)
@@ -0,0 +1,3 @@
fastecdsa
Flask
pycryptodome
+5
View File
@@ -0,0 +1,5 @@
#!/bin/bash
/usr/sbin/sshd -D &
chmod +x ./main.py
./main.py
Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

@@ -0,0 +1,8 @@
function logout() {
document.cookie = "token=;";
}
setTimeout(function () {
let flashItem = document.getElementById("flashes");
flashItem.style.display = "none";
}, 2000);
@@ -0,0 +1,60 @@
body {
margin: 0;
padding: 0;
font-family: Arial, sans-serif;
background-color: #f4f4f4;
}
h1 {
text-align: center;
color: #333;
margin-top: 0;
}
.container {
max-width: 400px;
margin: 5% auto;
margin-bottom: 0;
background-color: #fff;
padding: 20px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
input {
width: 100%;
padding: 10px;
margin-bottom: 10px;
border: 1px solid #ccc;
border-radius: 3px;
box-sizing: border-box;
}
input[type="submit"] {
width: 100%;
padding: 10px;
background-color: #007bff;
color: #fff;
border: none;
border-radius: 3px;
cursor: pointer;
}
p {
margin: 10px 0;
}
#flashes {
max-width: 400px;
margin: 0 auto;
list-style: none;
padding: 0;
margin-top: 20px;
text-align: center;
}
#flashes li {
color: #ff6b6b;
padding: 5px;
border-radius: 3px;
}
@@ -0,0 +1,50 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>BurveSigner</title>
<link
rel="stylesheet"
href="{{ url_for('static', filename='style.css') }}"
/>
<link
rel="shortcut icon"
href="{{ url_for('static', filename='favicon.ico') }}"
/>
</head>
<body>
<div class="container">
<h1>🅱️urveSigner</h1>
{% if data %}
<p>{{ data }}</p>
<a onclick="logout()" href="/">Logout</a>
{% else %}
<form action="/" method="post">
<input
type="text"
name="username"
placeholder="Username"
autofocus
required
/>
<input
type="password"
name="password"
placeholder="Password"
required
/>
<input type="submit" value="Login" />
</form>
{% endif %}
</div>
{% with messages = get_flashed_messages() %} {% if messages %}
<ul id="flashes">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %} {% endwith %}
</body>
<script src="{{ url_for('static', filename='script.js') }}"></script>
</html>
+20
View File
@@ -0,0 +1,20 @@
FROM public.ecr.aws/docker/library/php:8.0-apache
ARG PASSWORD
RUN echo root:${PASSWORD} | chpasswd
RUN apt-get update && apt-get install -y openssh-server curl
RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
RUN service ssh start
COPY src/ /var/www/html
RUN mkdir /var/www/html/backups
RUN chown -R www-data:www-data /var/www/html/backups
RUN chmod -R 777 /var/www/html/backups
RUN touch /flag.txt
COPY start.sh .
RUN chmod +x start.sh
CMD ./start.sh
+11
View File
@@ -0,0 +1,11 @@
version: '3.1'
services:
crawlback:
build:
context: .
args:
- PASSWORD=root
ports:
- "21000:80"
- "21022:22"
+41
View File
@@ -0,0 +1,41 @@
<?php
function get($url){
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url,
));
$resp = curl_exec($curl);
curl_close($curl);
return $resp;
}
function save($data){
$filename = 'backups/' . randstr(8) . '.html';
$fp = fopen($filename, 'w');
fwrite($fp, $data);
fclose($fp);
return $filename;
}
function randstr($length){
$str = '';
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$size = strlen($chars);
for ($i = 0; $i < $length; $i++) {
$str .= $chars[rand(0, $size - 1)];
}
return $str;
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$url = $_POST["url"];
$data = get($url);
header('Location: ' . save($data));
} else {
echo "Invalid request method";
}
?>
+24
View File
@@ -0,0 +1,24 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="https://cdn.tailwindcss.com"></script>
<title>Crawlback</title>
</head>
<body class="bg-white">
<div class="grid h-screen place-content-center">
<div>
<h1 class="tracking-wide text-sky-500 text-9xl font-bold">Crawlback Machine</h1>
</div>
<label class="block">
<span class="sr-only">URL to Crawlback</span>
<form action="crawlback.php" method="post">
<div class="grid grid-cols-1 gap-2">
<input type="text" id="url" name="url" class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-sky-500 focus:border-sky-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-sky-500 dark:focus:border-sky-500" required placeholder="https://ctftime.org"></input>
<input type="submit" value="fetch" class="text-white bg-sky-500 hover:bg-sky-600 focus:ring-4 focus:outline-none focus:ring-sky-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-sky-600 dark:hover:bg-sky-700 dark:focus:ring-sky-800">
</div>
</form>
</label>
</div>
</body>
</html>
+2
View File
@@ -0,0 +1,2 @@
/usr/sbin/sshd -D &
apache2-foreground
+233
View File
@@ -0,0 +1,233 @@
version: '3.1'
services:
# --- art ---
art:
hostname: art
restart: always
build:
context: art
args:
- PASSWORD=$PASSWORD_10000
volumes:
- ../receiver/flags/art.txt:/flag.txt:ro
- ../utils/bashrc:/root/.bashrc:ro
- ../utils/preexec.sh:/root/.preexec.sh:ro
ports:
- "10000:8080"
- "10022:22"
extra_hosts:
- "host.docker.internal:host-gateway"
# --- art ---
# --- xl ---
xl:
hostname: xl
restart: always
build:
context: xl
args:
- PASSWORD=$PASSWORD_11000
volumes:
- ../receiver/flags/xl.txt:/flag.txt:ro
- ../utils/bashrc:/root/.bashrc:ro
- ../utils/preexec.sh:/root/.preexec.sh:ro
ports:
- "11000:3000"
- "11022:22"
extra_hosts:
- "host.docker.internal:host-gateway"
# --- xl ---
# --- gemas-notes ---
database:
restart: always
image: public.ecr.aws/docker/library/mysql:8
container_name: gemas-database
environment:
MYSQL_ROOT_PASSWORD: why_my_random_string_password_doesnot_working
MYSQL_DATABASE: gemasnotes
volumes:
- ./gemas-notes/src/db/init.sql:/docker-entrypoint-initdb.d/init.sql
gemas-notes:
hostname: gemas-notes
restart: always
container_name: gemas-notes
build:
context: ./gemas-notes/src/note-service
dockerfile: Dockerfile
args:
- PASSWORD=$PASSWORD_12000
depends_on:
- database
- validation-service
volumes:
- ../utils/bashrc:/root/.bashrc:ro
- ../utils/preexec.sh:/root/.preexec.sh:ro
ports:
- "12022:22"
extra_hosts:
- "host.docker.internal:host-gateway"
validation-service:
restart: always
container_name: validation-service
build:
context: ./gemas-notes/src/validation-service
dockerfile: Dockerfile
depends_on:
- database
ports:
- "12000:80"
# --- gemas-notes ---
# --- pasta ---
pasta:
hostname: pasta
restart: always
build:
context: pasta
args:
- PASSWORD=$PASSWORD_13000
volumes:
- ../utils/bashrc:/root/.bashrc:ro
- ../utils/preexec.sh:/root/.preexec.sh:ro
- ../receiver/flags/pasta.txt:/ctf/pasta/flag.txt:ro
ports:
- "13000:8000"
- "13022:22"
extra_hosts:
- "host.docker.internal:host-gateway"
# --- pasta ---
# --- burvesigner ---
burvesigner:
hostname: burvesigner
restart: always
container_name: burvesigner
build:
context: ./burvesigner
args:
- PASSWORD=$PASSWORD_14000
ports:
- "14000:80"
- "14022:22"
volumes:
- ../utils/bashrc:/root/.bashrc:ro
- ../utils/preexec.sh:/root/.preexec.sh:ro
- ../receiver/flags/burvesigner.txt:/flag.txt:ro
- ../receiver/files/burvesigner.priv:/priv.data:ro
extra_hosts:
- "host.docker.internal:host-gateway"
# --- burvesigner ---
# --- gemas-fetcher ---
gemas-fetcher:
container_name: gemas-fetcher
hostname: gemas-fetcher
build:
context: ./gemas-fetcher
dockerfile: Dockerfile
args:
- PASSWORD=$PASSWORD_16000
ports:
- "16000:8000"
- "16022:22"
environment:
- MONGO_URI=mongodb://ctf:asjdkjk23j1k3dsdn2h233j3jj@mongodb:27017/web_fetcher?authSource=admin
- APP_URI=http://0.0.0.0:16000
volumes:
- ../utils/bashrc:/root/.bashrc:ro
- ../utils/preexec.sh:/root/.preexec.sh:ro
- ../receiver/flags/gemas-fetcher.txt:/flag.txt:ro
extra_hosts:
- "host.docker.internal:host-gateway"
depends_on:
- mongodb
mongodb:
container_name: mongodb_ctf
image: public.ecr.aws/docker/library/mongo:4.4
environment:
- MONGO_INITDB_ROOT_USERNAME=ctf
- MONGO_INITDB_ROOT_PASSWORD=asjdkjk23j1k3dsdn2h233j3jj
- MONGO_INITDB_DATABASE=web_fetcher
# --- gemas-fetcher ---
# --- s3 ---
s3:
hostname: s3
restart: always
container_name: s3
build:
context: ./s3
args:
- PASSWORD=$PASSWORD_20000
ports:
- "20000:80"
- "20022:22"
volumes:
- ../utils/bashrc:/root/.bashrc:ro
- ../utils/preexec.sh:/root/.preexec.sh:ro
- ../receiver/flags/s3.txt:/flag.txt:ro
extra_hosts:
- "host.docker.internal:host-gateway"
# --- s3 ---
# --- crawlback ---
crawlback:
hostname: crawlback
restart: always
build:
context: crawlback
args:
- PASSWORD=$PASSWORD_21000
volumes:
- ../receiver/flags/crawlback.txt:/flag.txt:ro
- ../utils/bashrc:/root/.bashrc:ro
- ../utils/preexec.sh:/root/.preexec.sh:ro
ports:
- "21000:80"
- "21022:22"
extra_hosts:
- "host.docker.internal:host-gateway"
# --- crawlback ---
# --- back-to-basic ---
back-to-basic:
hostname: back-to-basic
restart: always
build:
context: back-to-basic
args:
- PASSWORD=$PASSWORD_22000
volumes:
- ../receiver/flags/back-to-basic.txt:/flag.txt:ro
- ../utils/bashrc:/root/.bashrc:ro
- ../utils/preexec.sh:/root/.preexec.sh:ro
ports:
- "22000:8000"
- "22022:22"
extra_hosts:
- "host.docker.internal:host-gateway"
# --- back-to-basic ---
# --- hirnfick ---
hirnfick:
hostname: hirnfick
restart: always
build:
context: hirnfick
args:
- PASSWORD=$PASSWORD_15000
volumes:
- ../receiver/flags/hirnfick.txt:/flag.txt:ro
- ../utils/bashrc:/root/.bashrc:ro
- ../utils/preexec.sh:/root/.preexec.sh:ro
ports:
- "15000:8000"
- "15022:22"
extra_hosts:
- "host.docker.internal:host-gateway"
# --- hirnfick ---
+21
View File
@@ -0,0 +1,21 @@
FROM public.ecr.aws/docker/library/python:3.10.6
ARG PASSWORD
RUN echo root:${PASSWORD} | chpasswd
RUN apt-get update && apt-get install -y openssh-server curl
RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
RUN service ssh start
RUN pip install --upgrade mongoengine blacksheep uvicorn passlib pycryptodome pytz urllib3 requests
WORKDIR /app
COPY ./src .
RUN touch /flag.txt
COPY ./start.sh .
RUN chmod +x /app/start.sh
CMD ./start.sh
@@ -0,0 +1,318 @@
#main-wrapper .left-sidebar[data-sidebarbg=skin5], #main-wrapper .left-sidebar[data-sidebarbg=skin5] ul {
background-color: white !important;
}
.sidebar-nav ul .sidebar-item .sidebar-link.active i, .sidebar-nav ul, .sidebar-nav ul .sidebar-item.selected > .sidebar-link i {
color: #ffff !important;
}
.sidebar-nav ul .sidebar-item .sidebar-link, .sidebar-nav ul .sidebar-item .sidebar-link i {
color: #888889 !important;
}
.sidebar-nav ul .sidebar-item .sidebar-link:hover, .sidebar-item .sidebar-link:hover i{
color: #0178BC;
}
.sidebar-nav ul .sidebar-item .sidebar-link.active,
.sidebar-nav ul .sidebar-item .sidebar-link:hover {
opacity: 1;
}
.sidebar-nav ul .sidebar-item.selected > .sidebar-link {
color: #ffff !important;
background: #0178BC;
margin: 0px 15px;
opacity: 1;
border-radius: 10px;
}
#main-wrapper .topbar .top-navbar .navbar-header[data-logobg=skin5] {
background: #fff;
}
#navbarSupportedContent {
background: #fff!important;
}
.topbar .top-navbar .navbar-nav>.nav-item:hover {
background:none;
}
.logo-text{
color: #0178BC;
}
.bg-main{
background-color: #0178BC;
color: #fff;
}
.bg-main:hover{
background-color: #0467a0;
color: #fff;
}
.text-main{
color: #00659F;
}
.border-primary{
border-color: #00659F!important;
}
/* Notification */
.topbar .mailbox{
min-width: 400px;
}
.notification-button i, .notification-icon i {
color: #6F767E;
font-size: 1.5em;
}
.notification-button .blip {
background-color: #FF6A55;
border-radius: 50%;
bottom: 45px;
height: 8px;
left: 10px;
position: relative;
transition: 0.2 ease-in-out;
width: 8px;
}
.notification-icon .blip {
background-color: #FF6A55;
border-radius: 50%;
bottom: 23px;
height: 8px;
left: 25px;
position: relative;
transition: 0.2 ease-in-out;
width: 8px;
}
.notification-button .blip.hide {
opacity: 0;
}
.notify-time{
font-size: 10px;
}
.rounded-m{
border-radius: 5px !important;
}
.rounded-xl{
border-radius: 10px !important;
}
.form-control-sm, .form-control {
border-radius: 8px !important;
}
/* Table */
.tb-head-first { border-top-left-radius: 10px !important;}
.tb-head-last { border-top-right-radius: 10px !important;}
.table>:not(caption)>*>* {
border : 0 !important
}
/* Modal */
.modal-content{
background-color: #F2F5F8;
}
.card-addons{
/* width: 11.5rem; */
/* position: relative; */
}
.card-header-addons{
background: linear-gradient(91.25deg, #0178BC 0%, #005281 100%);
border-radius: 6px 6px 0px 0px;
padding: 10px;
position: relative;
}
.card-body-addons{
background: #FFF;
border-radius: 0px 0px 6px 6px;
padding: 10px;
}
.add-ons-img{
position: absolute;
bottom: 5px;
right: 5px;
width: auto !important;
}
/* common */
.ribbon {
width: 150px;
height: 150px;
overflow: hidden;
position: absolute;
}
.ribbon::before,
.ribbon::after {
position: absolute;
z-index: -1;
content: '';
display: block;
border: 5px solid #2980b9;
}
.ribbon span {
position: absolute;
display: block;
width: 300px;
padding: 5px 0;
background: linear-gradient(152.92deg, #FFA800 16.92%, #D08900 93.43%);;
box-shadow: 0 5px 10px rgba(0,0,0,.1);
color: #fff;
font: 700 10px/1 'Lato', sans-serif;
text-shadow: 0 1px 1px rgba(0,0,0,.2);
text-transform: uppercase;
text-align: center;
}
/* top right*/
.ribbon-top-right {
top: 0px;
right: 0px;
}
.ribbon-top-right::before,
.ribbon-top-right::after {
border-top-color: transparent;
border-right-color: transparent;
}
.ribbon-top-right::before {
top: 0;
left: 0;
}
.ribbon-top-right::after {
bottom: 0;
right: 0;
}
.ribbon-top-right span {
left: -25px;
top: 15px;
transform: rotate(45deg);
}
/* Button */
.btn-info {
color: #fff;
background-color: #0178BC;
border-color: #0178BC;
}
.btn-info:hover {
color: #fff;
background-color: #0890df;
border-color: #0890df;
}
.btn-info.focus,
.btn-info:focus {
color: #fff;
background-color: #0883cb;
border-color: #0890df;
-webkit-box-shadow: 0 0 0 0.2rem #0572b19f;
box-shadow: 0 0 0 0.2rem #0572b19f;
}
.btn-info.disabled,
.btn-info:disabled {
color: #fff;
background-color: #0178BC;
border-color: #0178BC;
}
.btn-info:not(:disabled):not(.disabled).active,
.btn-info:not(:disabled):not(.disabled):active,
.show > .btn-info.dropdown-toggle {
color: #fff;
background-color: #0890df;
border-color: #068ad6;
}
.btn-info:not(:disabled):not(.disabled).active:focus,
.btn-info:not(:disabled):not(.disabled):active:focus,
.show > .btn-info.dropdown-toggle:focus {
-webkit-box-shadow: 0 0 0 0.2rem rgba(67, 111, 178, 0.5);
box-shadow: 0 0 0 0.2rem rgba(67, 111, 178, 0.5);
}
/* Pagination */
.page-item .page-link{
border-radius: 8px !important;
border-color: #F1F7FF !important;
background-color: #F1F7FF !important;
}
.page-item.active .page-link{
background-color: #0178BC !important;
border-color: #0178BC !important;
}
.paginate_button{
margin: 0 5px;
}
.mini-sidebar .sidebar-nav ul .sidebar-item .sidebar-link.active {
margin: 0px 5px;
}
.mini-sidebar .sidebar-item.mn{
margin-left: 1rem!important;
}
@media (max-width: 1199.98px) {
.sidebar-nav ul .sidebar-item .sidebar-link.active {
margin: 0px 5px;
}
.sidebar-item.mn{
margin-left: 1rem!important;
}
}
.swal2-html-container{
margin: 0 !important;
}
.swal2-close{
font-size: 14px !important;
top: 10px;
}
.bg-red{
color: #fff;
background-color: #dc3545;
border-color: #dc3545;
}
.swal2-popup{
width: 25em !important;
}
.guide-step{
border: 2px solid #0178BC;
}
.guide-step .driver-popover-title{
font-size: 16px !important;
}
.guide-step .driver-popover-footer button{
border: 1px solid #0178BC !important;
color: #0178BC !important;
font: 14px/normal sans-serif !important;
background-color: transparent !important;
}
.guide-step .driver-prev-btn{
display: none !important;
}
.card-info{
background-color: rgba(1, 120, 188, 0.08);
color: #0178BC;
padding: 20px;
border-radius: 10px;
}
@@ -0,0 +1,92 @@
.email {
display: grid;
grid-template-columns: 50vw;
grid-auto-rows: min-content;
justify-content: center;
/* padding: 10rem 0; */
}
.email__header,
.email__content,
.email__footer {
padding: 3.2rem;
}
.email__container {
display: grid;
grid-template-columns: 1fr;
grid-auto-rows: min-content;
color: #333333;
background-color: #F2F5F8;
padding: 3.2rem;
}
.email__header {
display: grid;
grid-template-columns: 1fr;
grid-gap: 2rem;
padding-bottom: 2rem;
}
.email__logo {
width: 3.5rem;
height: 3.5rem;
}
.email__title {
font-size: 2.4rem;
font-weight: 900;
color: #0178BC;
}
.email__content {
display: grid;
grid-template-columns: 1fr;
grid-auto-rows: min-content;
grid-gap: 2rem;
background-color: #fff;
border-radius: 4px;
}
.email__footer {
display: grid;
grid-template-columns: 1fr;
grid-auto-rows: min-content;
grid-gap: 4rem;
font-size: 1.4rem;
font-weight: 400;
background-color: #F7F9FC;
}
.email__footer .email__gmail {
color: #0178BC;
}
.email__content p {
font-size: 1.6rem;
font-weight: 400;
}
.email__title-content {
font-size: 1.6rem;
font-weight: 600;
}
.email__cta {
justify-self: start;
text-transform: uppercase;
outline: none;
border: none;
background-color: var(--color-secondary);
padding: 1rem 3rem;
border-radius: 4px;
font-family: var(--font-primary);
font-size: 1.4rem;
font-weight: 600;
color: #fff;
cursor: pointer;
}
.email__gmail {
}
@@ -0,0 +1,6 @@
.reset__redirect {
text-decoration: none;
color: #00A5CE;
font-size: 1.6rem;
font-weight: 400;
}
Whitespace-only changes.
@@ -0,0 +1,214 @@
@import url(icons/font-awesome/css/fontawesome-all.css);
@import url(icons/themify-icons/themify-icons.css);
@import url(icons/material-design-iconic-font/css/materialdesignicons.min.css);
.forgot {
min-height: 100vh;
}
.forgot__container {
display: grid;
grid-template-columns: 75vw;
grid-auto-rows: min-content;
justify-content: center;
align-content: center;
padding: 8rem 0;
position: relative;
}
@media screen and (max-width: 28em) {
.forgot__container {
grid-template-columns: 1fr;
padding: 8rem 3rem;
}
}
.forgot__form-box {
display: grid;
grid-template-columns: 55% 1fr;
grid-auto-rows: min-content;
filter: drop-shadow(0px 0px 30px rgba(0, 0, 0, .15));
}
.show_password .btn {
border: none;
background: none;
}
.show_password .btn:focus, .show_password .btn.focus, .show_password .btn:hover{
outline: none !important;
box-shadow: none !important;
cursor: pointer;
}
@media screen and (max-width: 28em) {
.forgot__form-box {
grid-template-columns: 1fr;
}
}
.forgot__banner {
display: grid;
grid-template-columns: 1fr;
grid-auto-rows: min-content;
align-content: flex-end;
padding: 6rem 4rem;
background-image: linear-gradient(0, rgba(0,0,0,.4), rgba(0,0,0,.4)), url('../images/login/login-banner.png');
background-size: cover;
background-position: center center;
}
.forgot__banner-detail {
display: flex;
flex-direction: column;
gap: 1rem;
}
.forgot__banner-detail img {
width: 9rem;
}
@media screen and (max-width: 28em) {
.forgot__banner {
padding: 4rem;
}
}
.forgot__banner-title {
font-size: 3.2rem;
font-weight: 600;
}
.forgot__banner-desc {
font-size: 1.4rem;
font-weight: 400;
}
@media screen and (max-width: 28em) {
.forgot__banner-title {
font-size: 2.8rem;
}
.forgot__banner-desc {
font-size: 1.2rem;
}
}
.forgot__form {
display: grid;
grid-template-columns: 1fr;
grid-auto-rows: min-content;
align-content: space-between;
grid-gap: 6rem;
padding: 5rem;
background-color: #fff;
}
.forgot__form-logo {
width: 4.2rem;
}
.forgot__form-title {
font-size: 2.4rem;
font-weight: 500;
color: var(--color-font-primary);
}
.forgot__form > div {
display: grid;
grid-template-columns: 1fr;
grid-auto-rows: min-content;
grid-gap: 3rem;
}
.input-group {
display: grid;
grid-template-columns: 1fr;
grid-auto-rows: min-content;
grid-gap: 1rem;
}
.input-group .icon-eye {
position: absolute;
bottom: 10px;
right: 10px;
}
@media screen and (max-width: 28em) {
.input-group .icon-eye {
bottom: 10px;
}
}
.input-group label {
font-size: 1.4rem;
font-weight: 500;
color: #5F6377;
}
.input-group input {
outline: none;
font-family: var(--font-primary);
background: #FCFCFD;
border: 1px solid #CFD0D7;
border-radius: 2px;
padding: 1rem 1.2rem;
transition: .1s ease;
}
.input-group input::placeholder {
font-size: 1.2rem;
font-weight: 400;
color: #939393;
letter-spacing: 1px;
}
.input-group input:focus {
border: 1px solid #0094B9;
box-shadow: 0px 0px 4px rgba(52, 133, 254, 0.41);
}
.block-help {
font-weight: 300;
font-size: 12px;
}
.forgot-pass,
.forgot-pass:visited {
justify-self: end;
text-decoration: none;
font-size: 1.2rem;
font-weight: 400;
color: var(--color-secondary);
}
.forgot__redirect {
justify-self: center;
font-size: 1.2rem;
font-weight: 400;
color: #989898;
}
.forgot__redirect a {
text-decoration: none;
color: var(--color-secondary);
font-weight: 600;
}
.forgot__cta {
outline: none;
border: none;
background-color: var(--color-secondary);
padding: 1rem 3rem;
border-radius: 4px;
font-family: var(--font-primary);
font-size: 1.4rem;
font-weight: 600;
color: #fff;
cursor: pointer;
}
.forgot-compliment {
position: absolute;
bottom: 0;
right: 0;
width: 40rem;
z-index: -1;
}
@@ -0,0 +1,13 @@
/*!
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face {
font-family: 'Font Awesome 5 Brands';
font-style: normal;
font-weight: normal;
src: url("../webfonts/fa-brands-400.eot");
src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); }
.fab {
font-family: 'Font Awesome 5 Brands'; }
@@ -0,0 +1,5 @@
/*!
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}
@@ -0,0 +1,14 @@
/*!
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face {
font-family: 'Font Awesome 5 Free';
font-style: normal;
font-weight: 400;
src: url("../webfonts/fa-regular-400.eot");
src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); }
.far {
font-family: 'Font Awesome 5 Free';
font-weight: 400; }
@@ -0,0 +1,5 @@
/*!
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:Font Awesome\ 5 Free;font-weight:400}
@@ -0,0 +1,15 @@
/*!
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face {
font-family: 'Font Awesome 5 Free';
font-style: normal;
font-weight: 900;
src: url("../webfonts/fa-solid-900.eot");
src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); }
.fa,
.fas {
font-family: 'Font Awesome 5 Free';
font-weight: 900; }
@@ -0,0 +1,5 @@
/*!
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:Font Awesome\ 5 Free;font-weight:900}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,5 @@
/*!
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{Line truncated
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,5 @@
/*!
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{Line truncated
@@ -0,0 +1,19 @@
// Animated Icons
// --------------------------
.@{fa-css-prefix}-spin {
animation: fa-spin 2s infinite linear;
}
.@{fa-css-prefix}-pulse {
animation: fa-spin 1s infinite steps(8);
}
@keyframes fa-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@@ -0,0 +1,16 @@
// Bordered & Pulled
// -------------------------
.@{fa-css-prefix}-border {
border-radius: .1em;
border: solid .08em @fa-border-color;
padding: .2em .25em .15em;
}
.@{fa-css-prefix}-pull-left { float: left; }
.@{fa-css-prefix}-pull-right { float: right; }
.@{fa-css-prefix}, .fas, .far, .fal, .fab {
&.@{fa-css-prefix}-pull-left { margin-right: .3em; }
&.@{fa-css-prefix}-pull-right { margin-left: .3em; }
}
@@ -0,0 +1,12 @@
// Base Class Definition
// -------------------------
.@{fa-css-prefix}, .fas, .far, .fal, .fab {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: inline-block;
font-style: normal;
font-variant: normal;
text-rendering: auto;
line-height: 1;
}
@@ -0,0 +1,6 @@
// Fixed Width Icons
// -------------------------
.@{fa-css-prefix}-fw {
text-align: center;
width: (20em / 16);
}
Loaded 50 of 1246 files, more files were not shown because too many files have changed in this diff. Show more