├── .gitignore
├── .htaccess
├── LICENSE.txt
├── README.md
├── TODO.txt
├── class
├── KippoGeo.class.php
├── KippoGraph.class.php
├── KippoIP.class.php
├── KippoInput.class.php
└── KippoPlayLog.class.php
├── config.php.dist
├── favicon.ico
├── gallery.php
├── generated-graphs
└── index.php
├── gpl.txt
├── images
├── alienvault.ico
├── bg.gif
├── dshield.ico
├── first.png
├── fortiguard.ico
├── index.php
├── ip_tracer.png
├── ipvoid.ico
├── kippo-graph-img.png
├── last.png
├── mcafee.ico
├── next.png
├── novirusthanks.ico
├── play.ico
├── prev.png
├── robtex.ico
├── virustotal.ico
├── warning.png
└── watchguard.ico
├── include
├── export.php
├── footer.php
├── geoplugin
│ └── geoplugin.class.php
├── header.php
├── index.php
├── kippo-ip.ajax.php
├── languages
│ ├── lang.ar.php
│ ├── lang.cs.php
│ ├── lang.de.php
│ ├── lang.el.php
│ ├── lang.en.php
│ ├── lang.es.php
│ ├── lang.et.php
│ ├── lang.fr.php
│ ├── lang.it.php
│ ├── lang.nl.php
│ ├── lang.pl.php
│ ├── lang.sk.php
│ └── lang.sv.php
├── libchart
│ ├── COPYING
│ ├── ChangeLog
│ ├── README
│ ├── classes
│ │ ├── libchart.php
│ │ ├── model
│ │ │ ├── ChartConfig.php
│ │ │ ├── DataSet.php
│ │ │ ├── Point.php
│ │ │ ├── XYDataSet.php
│ │ │ └── XYSeriesDataSet.php
│ │ └── view
│ │ │ ├── axis
│ │ │ ├── Axis.php
│ │ │ └── Bound.php
│ │ │ ├── caption
│ │ │ └── Caption.php
│ │ │ ├── chart
│ │ │ ├── BarChart.php
│ │ │ ├── Chart.php
│ │ │ ├── HorizontalBarChart.php
│ │ │ ├── LineChart.php
│ │ │ ├── PieChart.php
│ │ │ └── VerticalBarChart.php
│ │ │ ├── color
│ │ │ ├── Color.php
│ │ │ ├── ColorSet.php
│ │ │ └── Palette.php
│ │ │ ├── plot
│ │ │ └── Plot.php
│ │ │ ├── primitive
│ │ │ ├── Padding.php
│ │ │ ├── Primitive.php
│ │ │ └── Rectangle.php
│ │ │ └── text
│ │ │ └── Text.php
│ ├── doc
│ │ ├── DEJAVU_LICENSE
│ │ └── GNU_GPL_V3
│ ├── fonts
│ │ ├── DejaVuSansCondensed-Bold.ttf
│ │ ├── DejaVuSansCondensed.ttf
│ │ ├── OpenSans-Bold.ttf
│ │ └── OpenSans-Regular.ttf
│ └── images
│ │ └── PoweredBy.png
├── maxmind
│ ├── GeoLite2-City.mmdb
│ └── geoip2.phar
├── misc
│ ├── ip2host.php
│ ├── versionCheck.php
│ └── xss_clean.php
├── qgooglevisualapi
│ ├── QAnnotatedtimelineGoogleGraph.class.php
│ ├── QApikeyGoogleGraph.class.php
│ ├── QAreachartGoogleGraph.class.php
│ ├── QBarchartGoogleGraph.class.php
│ ├── QColumnchartGoogleGraph.class.php
│ ├── QConfig.class.php
│ ├── QGaugeGoogleGraph.class.php
│ ├── QGoogleGraph.class.php
│ ├── QInflector.class.php
│ ├── QIntensitymapGoogleGraph.class.php
│ ├── QLinechartGoogleGraph.class.php
│ ├── QMagictableGoogleGraph.class.php
│ ├── QMapGoogleGraph.class.php
│ ├── QMixupGoogleGraph.class.php
│ ├── QMotionchartGoogleGraph.class.php
│ ├── QOrgchartGoogleGraph.class.php
│ ├── QPiechartGoogleGraph.class.php
│ ├── QScatterchartGoogleGraph.class.php
│ ├── QTableGoogleGraph.class.php
│ ├── QTool.class.php
│ ├── QVizualisationGoogleGraph.class.php
│ ├── QWordcloudGoogleGraph.class.php
│ ├── config.inc.php
│ └── readme.txt
├── rb.php
├── sql.php
└── tor
│ ├── tor.class.php
│ └── tor_exit_node_list.txt
├── index.php
├── kippo-geo.php
├── kippo-graph.php
├── kippo-input.php
├── kippo-ip.php
├── kippo-play.php
├── kippo-playlog.php
├── kippo-scanner.php
├── robots.txt
├── scripts
├── BinFileReader.js
├── fancybox
│ ├── blank.gif
│ ├── fancy_close.png
│ ├── fancy_loading.png
│ ├── fancy_nav_left.png
│ ├── fancy_nav_right.png
│ ├── fancy_shadow_e.png
│ ├── fancy_shadow_n.png
│ ├── fancy_shadow_ne.png
│ ├── fancy_shadow_nw.png
│ ├── fancy_shadow_s.png
│ ├── fancy_shadow_se.png
│ ├── fancy_shadow_sw.png
│ ├── fancy_shadow_w.png
│ ├── fancy_title_left.png
│ ├── fancy_title_main.png
│ ├── fancy_title_over.png
│ ├── fancy_title_right.png
│ ├── fancybox-x.png
│ ├── fancybox-y.png
│ ├── fancybox.png
│ ├── index.php
│ ├── jquery.easing-1.3.pack.js
│ ├── jquery.fancybox-1.3.2.css
│ ├── jquery.fancybox-1.3.2.js
│ ├── jquery.fancybox-1.3.2.pack.js
│ ├── jquery.fancybox-1.3.2.setup.js
│ └── jquery.mousewheel-3.0.4.pack.js
├── hoverIntent.js
├── index.php
├── jquery-1.4.1.min.js
├── jquery-1.4.4.min.js
├── jquery.getUrlParam.js
├── jquery.tablesorter.js
├── jquery.tablesorter.pager.js
├── jspl.js
├── kippo-ip.js
├── kippo-playlog.js
└── superfish.js
└── styles
├── forms.css
├── gallery.css
├── homepage.css
├── index.php
├── layout.css
├── navi.css
├── playlog.css
├── portfolio.css
├── tables.css
└── tablesorter.css
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .idea/
3 | generated-graphs/
4 | config.php
5 |
6 | # These two are not actually ignored here,
7 | # but with git update-index --assume-unchanged
8 | include/maxmind/GeoLite2-City.mmdb
9 | include/tor/tor_exit_node_list.txt
--------------------------------------------------------------------------------
/.htaccess:
--------------------------------------------------------------------------------
1 |
2 | RewriteEngine On
3 | RewriteRule ^results\.php$ http://www.garyshood.com/virus/results.php$1 [R=301,L]
4 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Kippo-Graph
2 | ===========
3 |
4 | Kippo-Graph is a full featured script to visualize statistics for a Kippo based SSH honeypot.
5 |
6 | It uses the Libchart PHP chart drawing library by Jean-Marc Trémeaux,
7 | QGoogleVisualizationAPI PHP Wrapper for Google's Visualization API by Thomas Schäfer,
8 | RedBeanPHP library by Gabor de Mooij, MaxMind and geoPlugin geolocation technology.
9 |
10 | REQUIREMENTS:
11 | -------------
12 | 1. PHP version 5.3.4 or higher.
13 | 2. The following packages: _libapache2-mod-php5_, _php5-mysql_, _php5-gd_, _php5-curl_.
14 |
15 | On Ubuntu/Debian:
16 | > apt-get update && apt-get install -y libapache2-mod-php5 php5-mysql php5-gd php5-curl
17 | >
18 | > /etc/init.d/apache2 restart
19 |
20 | QUICK INSTALLATION:
21 | -------------------
22 | > wget http://bruteforce.gr/wp-content/uploads/kippo-graph-VERSION.tar.gz
23 | >
24 | > mv kippo-graph-VERSION.tar.gz /var/www/html
25 | >
26 | > cd /var/www/html
27 | >
28 | > tar zxvf kippo-graph-VERSION.tar.gz
29 | >
30 | > mv kippo-graph-VERSION kippo-graph
31 | >
32 | > cd kippo-graph
33 | >
34 | > chmod 777 generated-graphs
35 | >
36 | > cp config.php.dist config.php
37 | >
38 | > nano config.php #enter the appropriate values
39 |
40 | Browse to http://your-server/kippo-graph to view or generate the honeypot charts and statistics.
41 |
42 | Note 1: If you choose to disable `REALTIME_STATS` in your config.php file it is advisable to
43 | setup a cron job to update the charts in the background. The recommended way to do that
44 | is to add the following line in your crontab with `crontab -e` (make sure to change the
45 | kippo-graph path if it's different):
46 | > @hourly cd /var/www/html/kippo-graph && php kippo-graph.php > /dev/null 2>&1
47 |
48 | Note 2: If you want to use the Kippo-Scanner component you will have to allow Kippo-Graph's .htaccess file
49 | to take effect. You can do this by editing your Apache configuration file at /etc/apache2/apache2.conf
50 | and changing `AllowOverride None` to `AllowOverride All` for the /var/www/ Directory (only).
51 |
52 | Note 3: To fully use the geolocation features (Intensity Map) you will need to give CREATE
53 | TEMPORARY TABLES rights to your MySQL database user (most likely it has already been done).
--------------------------------------------------------------------------------
/TODO.txt:
--------------------------------------------------------------------------------
1 | TODO for new versions:
2 | + Use new version of QGoogleVisualAPI and generate more graphs (eg GeoMap instead of IntensityMap?)
3 | + 2nd tab on Intensity Map (or new map) with successes per country (temporary SQL table/query)
4 | + Add option to show results only from a particular sensor (add value in config.php and then change the SQL queries? Perhaps move all SQL query strings in seperate file)
5 | + Proxy detection resurrection, here are some lists: https://github.com/lfamorim/barrelroll/tree/master/full_list
6 | + Table with returning attackers (Kippo-Input). If username/password in auth table exists in userdb.txt then he logged in again (apart from the defaults).
7 | + Integrate or offer as separate utility the VirusTotal uploader by @0xAli (contact him again for file)
8 | + Use convert/save as ZIP file API from online-convert.com in Kippo-Input for downloaded files
9 | + Kippo-Input: downloaded files with curl (curl -O )
10 | + Add the dig/host/geoip information from Kippo-Playlog to Kippo-IP as well
11 |
12 | DONE:
13 | + Option to use local/offline geolocation service and not geoplugin, see: https://www.maxmind.com/app/support
14 | + Add www.ip-adress.com/whois/ in Kippo-Geo for IPs (limit of 50 lookups per day is OK)
15 | + Consider replacing NoVirusThanks with http://www.garyshood.com/virus/ and http://scanthis.net/
16 | + Integrate Kippo-Playlog
17 | + Seperate HTML and PHP where possible, tidy up code!
18 | + Add CSV dump/backup function
19 | + Graphs (.png) creation should be moved to xxx-generator for each component (or all in one!)
20 | + Move project to sf.net/googlecode.com/github.com (next milestone version)
21 | + Show basic stats like number of attacks, number of IPs, total commands, etc --OK--
22 | + Fix XSS in Kippo-Input --OK--
23 | + Human activity per week, Successes per day (line), Probing busiest days (Top 20), naming conventions/changes, update gallery. --OK--
24 | + URGENT: Fix "Successful logins from same IP", "Probes per day", "Successes per day", when the DB is very big. See: http://t.co/TltEfH89 --OK--
25 | + Successes per week graph, so gallery will look complete :P --OK--
26 | + Add timestamp to command tables --OK--
27 | + New table for passwd and various commands --OK--
28 | + Generate and post CHECKSUMS for the tar archive online --OK--
29 | + Include a license file. libchart is GPL, QGoogleVisualAPI is BSD 2-Clause (aka Modified BSD aka FreeBSD),
30 | geoplugin is free asks for recognition - OK,
31 | web template has its own license that requires link at the bottom - OK,
32 | honeycomb image in the logo requires attribution - OK,
33 | so Kippo-Graph license => GPL, mentioning all the others seperately,
34 | see: http://programmers.stackexchange.com/a/75464/43511
35 | + Make version checking more secure with a directive in config.php (UPDATE CHECK YES/NO) --OK--
36 | + Check IPs for proxies or not --NO FREE/EASY SOLUTION, ABANDON--
37 | + Visualize IP geolocation data --OK--
38 | + Temporary SQL table needed for IntensityMap --OK--
39 | + Create a proper image for index.php --OK--
40 | + Visualize or display wget commands --OK--
41 | + Visualize or display apt-get install commands --OK--
42 | + Better way to visualize input/commands => Simple text/table display --OK--
43 | + More libchart graphs (Pies, etc) where suited --OK--
44 |
--------------------------------------------------------------------------------
/class/KippoIP.class.php:
--------------------------------------------------------------------------------
1 | maxmind = new \GeoIp2\Database\Reader(DIR_ROOT . '/include/maxmind/GeoLite2-City.mmdb');
14 | if (TOR_CHECK == 'YES')
15 | $this->tor = new Tor();
16 |
17 | //Let's connect to the database
18 | R::setup('mysql:host=' . DB_HOST . ';port=' . DB_PORT . ';dbname=' . DB_NAME, DB_USER, DB_PASS);
19 | }
20 |
21 | function __destruct()
22 | {
23 | R::close();
24 | }
25 |
26 | public function printOverallIpActivity()
27 | {
28 | $db_query = "SELECT A.*, B.success FROM (
29 | SELECT ip, MAX(starttime) as starttime, COUNT(DISTINCT sessions.id) as sessions
30 | FROM sessions GROUP BY ip) A
31 | LEFT JOIN (
32 | SELECT sessions.ip, MAX(success) as success
33 | FROM sessions, auth
34 | WHERE sessions.id = auth.session
35 | GROUP BY ip) B on A.ip = B.ip
36 | ORDER BY A.ip";
37 |
38 | $rows = R::getAll($db_query);
39 |
40 | if (count($rows)) {
41 | echo 'Click column heads to sort data, rows to display attack details.
';
42 |
43 | echo '
44 | Total identified IP addresses: ' . count($rows) . ' |
---|
';
45 |
46 | //We create a skeleton for the table
47 | echo '';
48 | echo '';
49 | echo 'IP address | ';
50 | if (GEO_METHOD == 'LOCAL')
51 | echo 'Geolocation | ';
52 | if (TOR_CHECK == 'YES')
53 | echo 'Tor exit node | ';
54 | echo 'Sessions count | ';
55 | echo 'Success | ';
56 | echo 'Last seen | ';
57 | echo '
';
58 |
59 | //For every row returned from the database we add a new point to the dataset,
60 | //and create a new table row with the data as columns
61 | foreach ($rows as $row) {
62 | $success = is_null($row['success']) ? 'N/A' : $row['success'];
63 | $timestamp = is_null($row['starttime']) ? 'N/A' : $row['starttime'];
64 |
65 | echo '';
66 | echo '' . $row['ip'] . ' | ';
67 |
68 | if (GEO_METHOD == 'LOCAL') {
69 | try {
70 | $geodata = $this->maxmind->city($row['ip']);
71 | $geolocation = $geodata->city->name ? $geodata->city->name . ', ' . $geodata->country->name : $geodata->country->name;
72 |
73 | } catch (\GeoIp2\Exception\GeoIp2Exception $e) {
74 | $geolocation = 'N/A';
75 | }
76 | echo '' . $geolocation . ' | ';
77 | }
78 |
79 | if (TOR_CHECK == 'YES') {
80 | $exitnode = $this->tor->isTorExitNode($row['ip']) ? 'Yes' : 'No';
81 | echo '' . $exitnode . ' | ';
82 | }
83 |
84 | echo '' . $row['sessions'] . ' | ';
85 | echo '' . $success . ' | ';
86 | echo '' . $timestamp . ' | ';
87 | echo '
';
88 | }
89 |
90 | //Close tbody and table element, it's ready.
91 | echo '
';
92 | }
93 |
94 | echo '';
113 |
114 | echo '
';
115 | if (GEO_METHOD == 'LOCAL') {
116 | echo 'http://www.maxmind.com
';
117 | }
118 | else {
119 | //TODO
120 | }
121 | }
122 | }
123 |
124 | ?>
125 |
--------------------------------------------------------------------------------
/class/KippoPlayLog.class.php:
--------------------------------------------------------------------------------
1 | Hiding all entries which are smaller than ' . PLAYBACK_SIZE_IGNORE . 'kb.
';
21 |
22 | if (strtoupper(BACK_END_ENGINE) === 'COWRIE')
23 | $db_size = "size";
24 | else
25 | $db_size = "LENGTH(ttylog)";
26 |
27 | $db_query = "SELECT * FROM (SELECT ttylog.session, auth.timestamp, ROUND($db_size/1024, 2) AS size, COUNT(input) as input
28 | FROM ttylog
29 | JOIN auth ON ttylog.session = auth.session
30 | JOIN input ON ttylog.session = input.session
31 | WHERE auth.success = 1
32 | GROUP BY ttylog.session
33 | ORDER BY auth.timestamp ASC) s
34 | WHERE size > " . PLAYBACK_SIZE_IGNORE;
35 |
36 | $rows = R::getAll($db_query);
37 |
38 | echo '
39 | Total logs: ' . count($rows) . ' |
---|
';
40 |
41 | echo '';
42 | echo '';
43 | echo 'ID | ';
44 | echo 'Timestamp | ';
45 | echo 'Size | ';
46 | echo 'Input Commands | ';
47 | echo 'Action | ';
48 | echo '
';
49 |
50 | if (count($rows)) {
51 | // We create a skeleton for the table
52 | $counter = 1;
53 |
54 | // For every row returned from the database we create a new table row with the data as columns
55 | foreach ($rows as $row) {
56 | echo '';
57 | echo '' . $counter . ' | ';
58 | echo '' . $row['timestamp'] . ' | ';
59 | echo '' . $row['size'] . 'kb' . ' | ';
60 | echo '' . $row['input'] . ' | ';
61 | echo ' Play TTY Log | ';
62 | echo '
';
63 | $counter++;
64 | }
65 | }
66 |
67 | // Close tbody and table element, it's ready.
68 | echo '
';
69 |
70 | echo '';
88 |
89 | echo '
';
90 | }
91 | }
92 |
93 | ?>
94 |
--------------------------------------------------------------------------------
/config.php.dist:
--------------------------------------------------------------------------------
1 |
88 |
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/favicon.ico
--------------------------------------------------------------------------------
/generated-graphs/index.php:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/generated-graphs/index.php
--------------------------------------------------------------------------------
/images/alienvault.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/alienvault.ico
--------------------------------------------------------------------------------
/images/bg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/bg.gif
--------------------------------------------------------------------------------
/images/dshield.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/dshield.ico
--------------------------------------------------------------------------------
/images/first.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/first.png
--------------------------------------------------------------------------------
/images/fortiguard.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/fortiguard.ico
--------------------------------------------------------------------------------
/images/index.php:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/index.php
--------------------------------------------------------------------------------
/images/ip_tracer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/ip_tracer.png
--------------------------------------------------------------------------------
/images/ipvoid.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/ipvoid.ico
--------------------------------------------------------------------------------
/images/kippo-graph-img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/kippo-graph-img.png
--------------------------------------------------------------------------------
/images/last.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/last.png
--------------------------------------------------------------------------------
/images/mcafee.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/mcafee.ico
--------------------------------------------------------------------------------
/images/next.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/next.png
--------------------------------------------------------------------------------
/images/novirusthanks.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/novirusthanks.ico
--------------------------------------------------------------------------------
/images/play.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/play.ico
--------------------------------------------------------------------------------
/images/prev.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/prev.png
--------------------------------------------------------------------------------
/images/robtex.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/robtex.ico
--------------------------------------------------------------------------------
/images/virustotal.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/virustotal.ico
--------------------------------------------------------------------------------
/images/warning.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/warning.png
--------------------------------------------------------------------------------
/images/watchguard.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ikoniaris/kippo-graph/da45bddc93f2d7e8e31dde6248035816804f4ff6/images/watchguard.ico
--------------------------------------------------------------------------------
/include/export.php:
--------------------------------------------------------------------------------
1 | clean_input($_GET['type'])};
24 |
25 | $rows = R::getAll($db_query);
26 |
27 | $first = true; // flag for column titeles
28 |
29 | // open file without writing to disk
30 | $out = fopen('php://output', 'w');
31 |
32 | foreach ($rows as $row) {
33 | if ($first) {
34 | $titles = array();
35 | foreach ($row as $key => $val) {
36 | $titles[] = $key;
37 | }
38 | fputcsv($out, $titles); // write the titles
39 | $first = false; // no longer on the column titles
40 | }
41 | fputcsv($out, $row); // write all other rows
42 | }
43 | fclose($out);
44 |
45 | R::close();
46 |
47 | ?>
48 |
--------------------------------------------------------------------------------
/include/footer.php:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
16 |