<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TEAM FORREST Blog &#187; asterisk</title>
	<atom:link href="http://www.teamforrest.com/blog/tag/asterisk/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.teamforrest.com/blog</link>
	<description>Kamailio, Asterisk, VoIP, and IT Consulting</description>
	<lastBuildDate>Fri, 11 Mar 2011 04:48:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Explaining Sip Brute Force Attacks to Non-Techs</title>
		<link>http://www.teamforrest.com/blog/196/explaining-sip-brute-force-attacks/</link>
		<comments>http://www.teamforrest.com/blog/196/explaining-sip-brute-force-attacks/#comments</comments>
		<pubDate>Fri, 11 Mar 2011 04:48:24 +0000</pubDate>
		<dc:creator>Fred Posner</dc:creator>
				<category><![CDATA[security]]></category>
		<category><![CDATA[VoIP]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[brute force attack]]></category>
		<category><![CDATA[kamailio]]></category>
		<category><![CDATA[SIP]]></category>

		<guid isPermaLink="false">http://www.teamforrest.com/blog/?p=196</guid>
		<description><![CDATA[Today we received a call from a federal employee investigating a “hack” on a client&#8217;s system. Basically, the client suffered a SIP Brute Force attack on their elastix system. Besides the shock of a call from the feds (why did &#8230; <a href="http://www.teamforrest.com/blog/196/explaining-sip-brute-force-attacks/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Today we received a call from a federal employee investigating a “hack” on a client&#8217;s system. Basically, the client suffered a SIP Brute Force attack on their elastix system. Besides the shock of a call from the feds (<a href="http://www.voiptechchat.com/voip/457/amazon-ec2-sip-brute-force-attacks-on-rise/">why did they ignore those Amazon attacks?</a>), the realization of explaining a sip attack to someone not familiar with SIP, telephony, networking, or servers posed a little challenge.</p>
<p>So, how do we start?</p>
<p><strong>First step</strong>: We will no longer use the words SIP, Brute, Force, and Attack. =)</p>
<p>What we&#8217;re talking about is a scheme to make expensive calls through your phone system. Of course, this isn&#8217;t true for all scenarios, but the vast majority simply want to make expensive calls on your dime.</p>
<p><strong>How does it work?</strong></p>
<p>The bad guys trick your phone system into thinking they are a valid user.</p>
<p><strong>How can they do that?</strong></p>
<p>When phones connect to your phone system, the system replies with different messages. Based on those messages, the bad guys can figure out phone names. Think of your phone system as the receptionist. An attempt might be similar to&#8230;</p>
<p style="padding-left: 30px;"><strong>Bad Guy</strong>: “Hi, is Alice there?”<br />
<strong>Receptionist:</strong> “No, there is no Alice here. You have the wrong number.”<br />
<strong>Bad Guy: </strong>“Hi, is Bob there?”<br />
<strong>Receptionist: </strong>“Yes, who may I say is calling?”</p>
<p>Basically, there&#8217;s a different response based on if that person exists in the company. Same thing with the phones. Once the Bad Guys find out phone names, they then use their computers to crack the phone password.</p>
<p>Once the password is detected, they connect their phone to your system and begin making calls.</p>
<p><strong>What can I do to stop this?</strong></p>
<p>If the person in charge of your phone system doesn&#8217;t understand what this attack is, you need to hire a consultant to help you and/or train your administrator. If you or your administrator understand this attack, then you need to make sure you are following the best practices for SIP security (<a href="http://www.voiptechchat.com/voip/263/7-easy-steps-to-better-sip-security">here&#8217;s a good link for asterisk best practices</a>).</p>
<p>If you&#8217;re running <a href="http://www.asterisk.org">asterisk</a>, you might wish to <a title="Automatically Block Failed SIP Peer Registrations" href="http://www.teamforrest.com/blog/171/asterisk-no-matching-peer-found-block/">install a script that checks for attacks and blocks those connections</a>.</p>
<h3>Even better&#8230; consider <a href="http://www.kamailio.org">Kamailio</a>.</h3>
<p><a href="http://www.kamailio.org">Kamailio</a> (pronounced KAMA-ILLY-OH) is an open-source SIP proxy, registrar, application that is extremely robust and powerful. The software includes anti-flood features that really help protect your system and truly helps to minimize these annoying attacks.</p>
<p>Remember, the Internet is like a big city. Sure there&#8217;s great museums and entertainment, but there&#8217;s also bad, bad places filled with bad, bad people. If you&#8217;re going to leave your BMW unlocked in Hell&#8217;s Kitchen, don&#8217;t be surprised when it&#8217;s been taken around the block a few times.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.teamforrest.com/blog/196/explaining-sip-brute-force-attacks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Use ENUM to Save Real MONey</title>
		<link>http://www.teamforrest.com/blog/177/use-enum-to-save-real-money/</link>
		<comments>http://www.teamforrest.com/blog/177/use-enum-to-save-real-money/#comments</comments>
		<pubDate>Thu, 27 May 2010 19:07:58 +0000</pubDate>
		<dc:creator>Fred Posner</dc:creator>
				<category><![CDATA[VoIP]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[enum]]></category>
		<category><![CDATA[lookup]]></category>

		<guid isPermaLink="false">http://www.teamforrest.com/blog/?p=177</guid>
		<description><![CDATA[Ok — it almost rhymed. ENUM (read the wiki) refers to the mapping of telephone numbers to internet addresses. Think of it almost as reverse DNS for your phone number. Although there are many methods of integrating ENUM into your &#8230; <a href="http://www.teamforrest.com/blog/177/use-enum-to-save-real-money/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ok — it almost rhymed.</p>
<p>ENUM (<a href="http://en.wikipedia.org/wiki/ENUM">read the wiki</a>) refers to the mapping of telephone numbers to internet addresses. Think of it almost as reverse DNS for your phone number. Although there are many methods of integrating ENUM into your system, our current &#8220;favorite&#8221; is <a href="http://enumplus.org/">ENUMPlus.org</a>.</p>
<p>From their website:</p>
<blockquote><p>ENUM sources are very segregated and there was no global repository &#8211; until now. ENUMPlus queries all of the top ENUM lookup sources and returns the most accurate result with minimal overhead; meaning you only need to specify one source. ENUMPlus allows you to offload all of the query processing to our powerful servers so you don&#8217;t have to waste time and precious resources.</p></blockquote>
<p>Integrating ENUMplus into <a href="http://www.teamforrest.com/blog/tag/asterisk/">Asterisk</a> can be very quick and there&#8217;s a few choices/methods of going about it. You can choose to use their php scripts, go <a href="http://enumplus.org/wiki/index.php/AsteriskConfiguration16">direct from the dialplan</a>, or run your own lookup script. Here, we&#8217;ve chosen to write our own lookup script that basically does the following:</p>
<ol>
<li>Checks ENUMplus.org for a result (with a 2 second timeout)</li>
<li>Sets a variable of ENUMRESULT and returns to dialplan</li>
<li>The dialplan then evaluates that variable, and if a sip value is provided calls the number directly via SIP.</li>
</ol>
<p>Here&#8217;s an example dialplan:</p>
<pre class="brush: plain; title: ; notranslate">exten =&gt; _X.,1,Set(CALLTO=${EXTEN})
exten =&gt; _X.,n,Goto(out,1)
exten =&gt; out,1,AGI(enumcheck.pl,${CALLTO})
exten =&gt; out,n,GotoIf($[&quot;${ENUMRESULT}&quot; = &quot;FAIL&quot;]?pstn)
exten =&gt; out,n,GotoIf($[${ISNULL(${ENUMRESULT})}]?pstn)
exten =&gt; out,n,Dial(${ENUMRESULT},55)
exten =&gt; out,n,GotoIf($[&quot;${DIALSTATUS}&quot; = &quot;CHANUNAVAIL&quot; ]?pstn)
exten =&gt; out,n,GotoIf($[&quot;${DIALSTATUS}&quot; = &quot;CONGESTION&quot; ]?pstn)
exten =&gt; out,n,GotoIf($[&quot;${DIALSTATUS}&quot; = &quot;BUSY&quot; ]?busy)
exten =&gt; out,n,Hangup()
exten =&gt; out,n(pstn),Dial(SIP/${CALLTO}@yourprovider); or DAHDI, etc.
exten =&gt; out,n,GotoIf($[&quot;${DIALSTATUS}&quot; = &quot;CHANUNAVAIL&quot; ]?busy)
exten =&gt; out,n,GotoIf($[&quot;${DIALSTATUS}&quot; = &quot;CONGESTION&quot; ]?busy)
exten =&gt; out,n,GotoIf($[&quot;${DIALSTATUS}&quot; = &quot;BUSY&quot; ]?busy)
exten =&gt; out,n,Hangup()
exten =&gt; out,n(busy),Busy(5)
exten =&gt; out,n,Hangup()</pre>
<p>And here&#8217;s the script:</p>
<pre class="brush: perl; title: ; notranslate">#!/usr/bin/perl -w
use strict;
$|=1;
my ($phone, $url, $apikey, $result, @sip);

while(&lt;STDIN&gt;) {
	chomp;
	last unless length($_);
}

if ($ARGV[0]) {
	$phone = &amp;URLEncode($ARGV[0]);
} else {
	&amp;setvar(&quot;ENUMRESULT&quot;, &quot;FAIL&quot;);
	&amp;printverbose(&quot;enumlookup: No CALLTO received.&quot;,2);
	exit(0);
}

#Get via WEB
$apikey = &quot;REPLACE WITH YOUR KEY&quot;;
$url = &quot;http://enumplus.org/api&quot;;

$result = qx(curl -m 2 -s -d 'key=$apikey' $url/$phone);

if ($result) {
	if ($result =~ /SIP/i) {
		@sip = split(/\|/, $result);
		&amp;setvar(&quot;ENUMRESULT&quot;, $sip[0]);
		&amp;printverbose(&quot;enumlookup: $sip[0]&quot;,2);
	} else {
		&amp;setvar(&quot;ENUMRESULT&quot;, &quot;FAIL&quot;);
		&amp;printverbose(&quot;enumlookup: No sip address found.&quot;,2);
	}
} else {
	&amp;setvar(&quot;ENUMRESULT&quot;, &quot;FAIL&quot;);
	&amp;printverbose(&quot;enumlookup: Timeout or error&quot;,2);
}

sub URLEncode {
   my $theURL = $_[0];
   $theURL =~ s/([\W])/&quot;%&quot; . uc(sprintf(&quot;%2.2x&quot;,ord($1)))/eg;
   return $theURL;
}

sub setvar {
	my ($var, $val) = @_;
	print STDOUT &quot;SET VARIABLE $var \&quot;$val\&quot; \n&quot;;
	while(&lt;STDIN&gt;) {
		m/200 result=1/ &amp;&amp; last;
	}
	return;
}

sub printverbose {
	my ($var, $val) = @_;
	print STDOUT &quot;VERBOSE \&quot;$var\&quot; $val\n&quot;;
	while(&lt;STDIN&gt;) {
		m/200 result=1/ &amp;&amp; last;
	}
	return;
}</pre>
<p>Happy Coding!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.teamforrest.com/blog/177/use-enum-to-save-real-money/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Automatically Block Failed SIP Peer Registrations</title>
		<link>http://www.teamforrest.com/blog/171/asterisk-no-matching-peer-found-block/</link>
		<comments>http://www.teamforrest.com/blog/171/asterisk-no-matching-peer-found-block/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 12:54:33 +0000</pubDate>
		<dc:creator>Fred Posner</dc:creator>
				<category><![CDATA[security]]></category>
		<category><![CDATA[VoIP]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[brute force attack]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[SIP]]></category>

		<guid isPermaLink="false">http://www.teamforrest.com/blog/?p=171</guid>
		<description><![CDATA[Previously we posted a little script for quickly checking your asterisk log for failed peer registrations. Building on that script, and with the use of iptables and cron, you can easily (and automatically) block flooding traffic from your system. Iptables, &#8230; <a href="http://www.teamforrest.com/blog/171/asterisk-no-matching-peer-found-block/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Previously we posted <a href="http://www.teamforrest.com/blog/165/asterisk-failed-peer-sip-brute-force/">a little script for quickly checking your asterisk log for failed peer registrations</a>. Building on that script, and with the use of <strong>iptables</strong> and <strong>cron</strong>, you can easily (and automatically) block flooding traffic from your system. Iptables, a linux command line program to filter IP traffic, provides high level packet filtering before the traffic can be used to corrupt a program. Cron, the linux time scheduler, enables you to automatically run commands at scheduled time periods.</p>
<h2>Set up IP Tables</h2>
<p>We will not be discussing the intricacies of iptables in this post. There are excellent tutorials on iptables, and with most things linux, help is only a google away. To help identify the traffic blocked as asterisk related, a new chain will be created appropriately called&#8230; asterisk.</p>
<p>Here&#8217;s how to add the new chain:</p>
<pre class="brush: plain; title: ; notranslate">iptables -N asterisk
iptables -A INPUT -j asterisk
iptables -A FORWARD -j asterisk</pre>
<p>This will help identify hosts blocked for failed registrations.</p>
<h2>Asterisk&#8217;s Log for Failed Registrations</h2>
<p>In most cases of a sip flood attack, the host attempts registration to Asterisk. These hosts are identified in the Asterisk log (<strong>/var/log/messages</strong>) as &#8220;No matching peer found.&#8221; The following perl script scans /var/log/messages for these patterns, strips the IP address, and puts the IP address into an array.</p>
<p>After the file has been read, the IP addresses are counted (each count is a failed attempt), compared against the existing blocked hosts, and new occurrences are blocked. With this script we are blocking any host after the 4th failed attempt.</p>
<p>Here&#8217;s the script (<strong>last updated 05 SEP 2010</strong>):</p>
<pre class="brush: perl; title: ; notranslate">#!/usr/bin/perl -w
use strict;
use warnings;
my (@failhost);
my %currblocked;
my %addblocked;
my $action;

open (MYINPUTFILE, &quot;/var/log/asterisk/messages&quot;) or die &quot;\n&quot;, $!, &quot;Does log file file exist\?\n\n&quot;;

while (&lt;MYINPUTFILE&gt;) {
	my ($line) = $_;
	chomp($line);
	if ($line =~ m/\' failed for \'(.*?)\' - No matching peer found/) {
		push(@failhost,$1);
	}
	if ($line =~ m/\' failed for \'(.*?)\' – Wrong password/) {
		push(@failhost,$1);
	}
}

my $blockedhosts = `/sbin/iptables -n -L asterisk`;

while ($blockedhosts =~ /(.*)/g) {
	my ($line2) = $1;
	chomp($line2);
	if ($line2 =~ m/(\d+\.\d+\.\d+\.\d+)(\s+)/) {
		$currblocked{ $1 } = 'blocked';
	}
}

while (my ($key, $value) = each(%currblocked)){
	print $key . &quot;\n&quot;;
}

if (@failhost) {
	&amp;count_unique(@failhost);
	while (my ($ip, $count) = each(%addblocked)) {
		if (exists $currblocked{ $ip }) {
			print &quot;$ip already blocked\n&quot;;
		} else {
			$action = `/sbin/iptables -I asterisk -s $ip -j DROP`;
			print &quot;$ip blocked. $count attempts.\n&quot;;
		}
	}
} else {
	print &quot;no failed registrations.\n&quot;;
}

sub count_unique {
    my @array = @_;
    my %count;
    map { $count{$_}++ } @array;
    map {($addblocked{ $_ } = ${count{$_}})} sort keys(%count);
}</pre>
<h2>Schedule the script with cron</h2>
<p>The final step is to schedule your script to run every X minutes in cron. We&#8217;ve chosen to run our script every 2 minutes, but you can change this to 1 minute or any other time period you choose. Just remember&#8230; you can receive thousands of attempts within 2 minutes.</p>
<p>If you have named your script check-failed-regs.pl and placed it in your /usr/local/bin directory, your cron statement would look like this:</p>
<pre class="brush: plain; title: ; notranslate">*/2 * * * * perl /usr/local/bin/check-failed-regs.pl &amp;&gt; /dev/null</pre>
<p>Questions? Comments? We love feedback. Or, <a href="/contact.html">contact us</a> for more information.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.teamforrest.com/blog/171/asterisk-no-matching-peer-found-block/feed/</wfw:commentRss>
		<slash:comments>57</slash:comments>
		</item>
		<item>
		<title>Perl Script for Asterisk Failed Peer Registrations</title>
		<link>http://www.teamforrest.com/blog/165/asterisk-failed-peer-sip-brute-force/</link>
		<comments>http://www.teamforrest.com/blog/165/asterisk-failed-peer-sip-brute-force/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 18:46:57 +0000</pubDate>
		<dc:creator>Fred Posner</dc:creator>
				<category><![CDATA[security]]></category>
		<category><![CDATA[VoIP]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[brute force attack]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[SIP]]></category>

		<guid isPermaLink="false">http://www.teamforrest.com/blog/?p=165</guid>
		<description><![CDATA[I guess this might be better titled as the Quick and Dirty Perl Script&#8230; but here we go: And while we duck from @Merlyn&#8217;s criticisms (although we love his criticism), the basic usage is: perl [Whatever you named it].pl messages &#8230; <a href="http://www.teamforrest.com/blog/165/asterisk-failed-peer-sip-brute-force/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I guess this might be better titled as the <del datetime="2010-04-12T19:23:51+00:00">Quick and</del> Dirty Perl Script&#8230; but here we go:</p>
<pre class="brush: perl; title: ; notranslate">#!/usr/bin/perl -w
use strict;
use warnings;
my (@failhost);

open (MYINPUTFILE, &quot;/var/log/asterisk/$ARGV[0]&quot;) or die &quot;\n&quot;, $!, &quot;Does log file file exist\?\n\n&quot;;

while (&lt;MYINPUTFILE&gt;) {
	my ($line) = $_;
	chomp($line);
	if ($line =~ m/\' failed for \'(.*?)\' - No matching peer found/) {
		push(@failhost,$1);
	}
}

if (@failhost) {
	&amp;count_unique(@failhost);
} else {
	print &quot;no failed registrations.\n&quot;;
}

sub count_unique {
    my @array = @_;
    my %count;
    map { $count{$_}++ } @array;

	#print them out:

    map {print &quot;$_ = ${count{$_}}\n&quot;} sort keys(%count);

}</pre>
<p>And while we duck from @<a href="http://twitter.com/merlyn">Merlyn&#8217;s</a> criticisms (although we love his criticism), the basic usage is:</p>
<p>perl [Whatever you named it].pl messages<br />
<em> or</em> perl [Whatever you named it].pl messages.1</p>
<p><b>Results look like:</b></p>
<p>184.73.53.22 = 13586<br />
64.76.45.100 = 9895<br />
78.46.87.14 = 9960</p>
<p>Or &#8220;no failed registrations.&#8221; if you have no failed attempts.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.teamforrest.com/blog/165/asterisk-failed-peer-sip-brute-force/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Integrating Fax for Asterisk</title>
		<link>http://www.teamforrest.com/blog/156/integrating-fax-for-asterisk/</link>
		<comments>http://www.teamforrest.com/blog/156/integrating-fax-for-asterisk/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 03:08:41 +0000</pubDate>
		<dc:creator>Fred Posner</dc:creator>
				<category><![CDATA[VoIP]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[fax]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.teamforrest.com/blog/?p=156</guid>
		<description><![CDATA[Asterisk provides an open-source solution for IP Telephony (aka VoIP). Customizing your telephone system to increase productivity remains one of Asterisk’s greatest features. Today, we will look at using Asterisk to replace your need for a fax machine. Benefits Store &#8230; <a href="http://www.teamforrest.com/blog/156/integrating-fax-for-asterisk/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Asterisk provides an open-source solution for IP Telephony (aka VoIP). Customizing your telephone system to increase productivity remains one of Asterisk’s greatest features. Today, we will look at using Asterisk to replace your need for a fax machine.</p>
<h3>Benefits</h3>
<ul>
<li>Store faxes electronically</li>
<li>Reduce printing costs</li>
<li>Share faxes via email</li>
</ul>
<h3>Requirements</h3>
<ul>
<li>Server running Asterisk (32 bit compatibility needed)</li>
<li>Fax for Asterisk Software Add-on</li>
</ul>
<h2>Step One: Get the Fax for Asterisk Software License</h2>
<p>First, choose the licensing based on your needs. If you will only need to support 1 simultaneous fax <span id="more-156"></span> “session,” you may be interested in the Free Fax For Asterisk License. Digium provides the Free Fax for Asterisk software at no cost, limited one per installation of Asterisk. You can combine the Free Fax for Asterisk license with the paid Fax for Asterisk licensing if you will need additional simultaneous fax sessions.</p>
<p><em>For example, you can download and install Free Fax for Asterisk providing your system one (1) fax session. If you find you need additional simultaneous sessions, simply purchase a paid license (currently $39.99 per session).</em></p>
<p>To get the Fax for Asterisk software, go to the <a href="http://store.digium.com/">Digium Store</a>. Once “purchased” you will receive your license via email.</p>
<h2>Step Two: Download and Install the Fax for Asterisk Software</h2>
<p>Once you’ve received your license, there are many small steps needed to download, register, and install the software.</p>
<ul>
<li>Download and run the registration software (outgoing network traffic to TCP port 443 (SSL) must be allowed)</li>
</ul>
<pre>cd /root
wget http://downloads.digium.com/pub/register/x86-32/register
chmod 500 /root/register
/root/register</pre>
<ul>
<li>Complete the registration</li>
<li> Go to <a href="http://www.digium.com/en/docs/FAX/faa-download.php">http://www.digium.com/en/docs/FAX/faa-download.php</a> and discover which files to download</li>
<li> Download both the <strong>res_fax</strong> and <strong>res_fax_digium files</strong></li>
<li> Untar the res_fax file and copy it to the source file directory (<em>example res_fax-1.6.0_1.0.3-x86_32.tar.gz</em>)</li>
</ul>
<pre>tar xzvf res_fax-1.6.0_1.0.3-x86_32.tar.gz
cp /root/res_fax-1.6.0_1.0.3-x86_32/res_fax.so /usr/lib/asterisk/modules</pre>
<ul>
<li>Untar and install the res_fax_digium software (<em>example res_fax_digium-1.6.0_1.0.3-pentium4m_32.tar.gz</em>)</li>
</ul>
<pre>tar xzvf res_fax_digium-1.6.0_1.0.3-pentium4m_32.tar.gz
cp /root/res_fax_digium-1.6.0_1.0.3-pentium4m_32/res_fax_digium.so /usr/lib/asterisk/modules</pre>
<ul>
<li>Make a directory for your fax files</li>
</ul>
<pre>mkdir /var/spool/asterisk/fax</pre>
<h2>Step Three: Test if the Software Installed Correctly</h2>
<p>Restart asterisk and test if that the fax module has loaded:</p>
<pre>asterisk -rx "restart now"
asterisk -r
*CLI&gt; fax show stats</pre>
<p>If the software installed successfully, you should see something similar to:</p>
<pre>Fax Statistics:
---------------

Current Sessions     : 0
Transmit Attempts    : 0
Receive Attempts     : 0
Completed Faxes      : 0
Failed Faxes         : 0
*CLI&gt;
Digium T.38
Licensed Channels    : 1
Max Concurrent       : 0
Success              : 0
Canceled             : 0
No Fax               : 0
Partial              : 0
Negotiation Failed   : 0
Train Failure        : 0
Protocol Error       : 0
IO Partial           : 0
IO Fail              : 0
*CLI&gt;
Digium G.711
Licensed Channels    : 1
Max Concurrent       : 1
Success              : 0
Switched to T.38     : 0
Canceled             : 0
No Fax               : 0
Partial              : 0
Negotiation Failed   : 0
Train Failure        : 0
Protocol Error       : 0
IO Partial           : 0
IO Fail              : 0</pre>
<h2>Step Four: Make a dialplan</h2>
<p>Make a dialplan that fits your needs. Here’s an example for sending and receiving:</p>
<pre>[inboundfax]
exten =&gt; s,1,NoOp(**** FAX RECEIVED from ${CALLERID(num)} ${STRFTIME(${EPOCH},,%c)} ****)
exten =&gt; s,n,Set(FAXOPT(ecm)=yes)
exten =&gt; s,n,Set(FILENAME=fax-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)})
exten =&gt; s,n,Set(FAXFILE=${FILENAME}.tif)
exten =&gt; s,n,Set(FAXOPT(ecm)=yes)
exten =&gt; s,n,Set(FAXOPT(headerinfo)=Received by MYCOMPANY ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M)})
exten =&gt; s,n,Set(FAXOPT(localstationid)=5555551212)
exten =&gt; s,n,Set(FAXOPT(maxrate)=14400)
exten =&gt; s,n,Set(FAXOPT(minrate)=2400)
exten =&gt; s,n,NoOp(FAXOPT(ecm) : ${FAXOPT(ecm)})
exten =&gt; s,n,NoOp(FAXOPT(headerinfo) : ${FAXOPT(headerinfo)})
exten =&gt; s,n,NoOp(FAXOPT(localstationid) : ${FAXOPT(localstationid)})
exten =&gt; s,n,NoOp(FAXOPT(maxrate) : ${FAXOPT(maxrate)})
exten =&gt; s,n,NoOp(FAXOPT(minrate) : ${FAXOPT(minrate)})
exten =&gt; s,n,NoOp(**** RECEIVING FAX : ${FAXFILE} ****)
exten =&gt; s,n,ReceiveFAX(/var/spool/asterisk/fax/${FAXFILE})
exten =&gt; s,n,Hangup()
exten =&gt; h,1,NoOp(FAXOPT(ecm) : ${FAXOPT(ecm)})

[outboundfax]
exten =&gt; s,1,NoOp(send a fax)
exten =&gt; s,n,Set(FAXOPT(filename)=${FAXFILE})
exten =&gt; s,n,Set(FAXOPT(ecm)=yes)
exten =&gt; s,n,Set(FAXOPT(headerinfo)=Fax from MYCOMPANY +1 555 555 1212)
exten =&gt; s,n,Set(FAXOPT(localstationid)=15555551212)
exten =&gt; s,n,Set(FAXOPT(maxrate)=14400)
exten =&gt; s,n,Set(FAXOPT(minrate)=2400)
exten =&gt; s,n,SendFAX(/tmp/${FAXFILE},d)
exten =&gt; h,1,NoOp(FAXOPT(ecm) : ${FAXOPT(ecm)})</pre>
<h2>Step Five: Test</h2>
<p>How do you test? Simple point an incoming number to inboundfax,s,1 and watch the magic happen. Faxes will be saved to /var/spool/asterisk/fax/ in tiff format.</p>
<h2>But Wait! There&#8217;s More!</h2>
<p>Sure, you could stop there, but wouldn’t it be neat to automatically email the received fax in pdf format? Using an AGI script, you can simply convert the tiff file into pdf format, attach it to an email, and off it goes!</p>
<p>Now, there are literally a thousand ways to do this. You can write your AGI scripts in the programming language of your choice; every language has it’s pros and cons. In our example, we’re going to demonstrate this process using a Perl script.</p>
<h2>Install the Pre-reqs</h2>
<p>You will want to install ghostscript to help convert the graphic files. On a centos install, this is as easy as typing <strong>yum -y install ghostscript</strong>. If you are using a different build you can install how you like or download the code directly from <a href="http://www.ghostscript.com/">http://www.ghostscript.com/</a>.</p>
<p>For the Perl pre-reqs, you will want to install a few packages from CPAN (to send mail and use smtp authentication):</p>
<pre>perl -MCPAN -e shell
install MIME::Lite
install MIME::Base64
install Authen::SASL</pre>
<p>Next create your perl script. In this case, call it <strong>receivedfax.pl</strong> and place it in /var/lib/asterisk/agi-bin:</p>
<pre>#!/usr/bin/perl
use strict;
use MIME::Lite;

my ($msg,$stdinresult);

# $ARGV[0] = msgfrom, $ARGV[1] = msgto, $ARGV[2] = cidnum, $ARGV[3] = filename,
chomp($stdinresult = <stdin>);

if ($#ARGV != 3) {
	print qq(VERBOSE "FAIL: 4 Arguments needed" 2\n);
	chomp($stdinresult = <stdin>);
	exit(0);
}

system("tiff2ps -a /var/spool/asterisk/fax/$ARGV[3].tif | ps2pdf13 -sPAPERSIZE=letter - > /var/spool/asterisk/fax/$ARGV[3].pdf");

$msg = MIME::Lite->new(
	From => "$ARGV[0]",
	To => "$ARGV[1]",
	Subject => "FAX from $ARGV[2]",
	Type => 'multipart/mixed'
);

$msg->attach(
	Type => 'TEXT',
	Data => "Greetings.\n\nYou have received a fax from $ARGV[2]. (attached)\n\nSincerely,\nCOMPANY NAME\n\n"
);

$msg->attach(
	Type => 'image/pdf',
	Path => "/var/spool/asterisk/fax/$ARGV[3].pdf",
	Filename => "$ARGV[3].pdf",
	Disposition => 'attachment'
);

MIME::Lite->send('smtp', 'SMTP.SERVER.COM', Timeout=>60,
	AuthUser=>'MAILUSER', AuthPass=>'PASSWORD');

$msg->send;

system("rm -f /var/spool/asterisk/fax/$ARGV[3].pdf");

#example: receivedfax.pl "asterisk@mydomain.com" "JohnDoe@mydomain.com" 55512345678 fax-20091115-170217</pre>
<p>Then, modify your dialplan to run the AGI script:</p>
<pre>[inboundfax]
exten => s,1,NoOp(**** FAX RECEIVED from ${CALLERID(num)} ${STRFTIME(${EPOCH},,%c)} ****)
exten => s,n,Set(FAXOPT(ecm)=yes)
exten => s,n,Set(FILENAME=fax-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)})
exten => s,n,Set(FAXFILE=${FILENAME}.tif)
exten => s,n,Set(FAXOPT(ecm)=yes)
exten => s,n,Set(FAXOPT(headerinfo)=Received by MYCOMPANY ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M)})
exten => s,n,Set(FAXOPT(localstationid)=5555551212)
exten => s,n,Set(FAXOPT(maxrate)=14400)
exten => s,n,Set(FAXOPT(minrate)=2400)
exten => s,n,NoOp(FAXOPT(ecm) : ${FAXOPT(ecm)})
exten => s,n,NoOp(FAXOPT(headerinfo) : ${FAXOPT(headerinfo)})
exten => s,n,NoOp(FAXOPT(localstationid) : ${FAXOPT(localstationid)})
exten => s,n,NoOp(FAXOPT(maxrate) : ${FAXOPT(maxrate)})
exten => s,n,NoOp(FAXOPT(minrate) : ${FAXOPT(minrate)})
exten => s,n,NoOp(**** RECEIVING FAX : ${FAXFILE} ****)
exten => s,n,ReceiveFAX(/var/spool/asterisk/fax/${FAXFILE})
exten => s,n,Hangup()
exten => h,1,GotoIf($["${FAXOPT(ecm)}" = "no" ]?end)
exten => h,n,AGI(receivedfax.pl,from@domain.com,to@domain.com,${CALLERID(num)},${FILENAME})
exten => h,n(end),NoOp(FAXOPT(ecm) : ${FAXOPT(ecm)}) </pre>
<p>You can even create a similar script to transform a pdf into a tiff file and send via outbound fax:</p>
<pre>#!/usr/bin/perl -w
use strict;
use warnings;
sub random_name_generator($);

# usage: faxout.pl number filename
# example: faxout.pl 5555551212 myfax.pdf

if ($#ARGV != 1) {
	print qq(FAIL: 2 Arguments needed\n);
	exit(0);
}

my ($callto,$pdfname,$callfile,$filename);

$callto = $ARGV[0];
$pdfname = $ARGV[1];

my $tifname = $pdfname;
$tifname =~ s/.pdf/.tif/i;

system("gs -q -dNOPAUSE -dBATCH -sDEVICE=tiffg4 -sOutputFile=$tifname $pdfname");

if ($callto) {
	$filename = &#038;random_name_generator(12).".call";
	open (MYFILE, ">>/tmp/$filename") or die $!;
	$callfile = "Channel: Local/$callto\@outboundialcontext\n";
	$callfile = $callfile . "MaxRetries: 1\n";
	$callfile = $callfile . "RetryTime: 60\n";
	$callfile = $callfile . "WaitTime: 60\n";
	$callfile = $callfile . "Archive: yes\n";
	$callfile = $callfile . "Context: outboundfax\n";
	$callfile = $callfile . "Extension: s\n";
	$callfile = $callfile . "Priority: 1\n";
	$callfile = $callfile . "Set: FAXFILE=$tifname\n";
	print MYFILE $callfile;
	close (MYFILE);
	system("mv /tmp/$filename /var/spool/asterisk/outgoing");
}

sub random_name_generator($) {
	my ($namelength, $randomstring, @chars);
	$namelength = shift;
	@chars = ('a'..'z','A'..'Z','0'..'9');
	foreach (1..$namelength) {
		$randomstring .= $chars[rand @chars];
	}
	return $randomstring;
}</pre>
<p>Happy Coding!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.teamforrest.com/blog/156/integrating-fax-for-asterisk/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Skype for Asterisk Public Beta</title>
		<link>http://www.teamforrest.com/blog/136/skype-for-asterisk-public-beta/</link>
		<comments>http://www.teamforrest.com/blog/136/skype-for-asterisk-public-beta/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 20:14:30 +0000</pubDate>
		<dc:creator>Fred Posner</dc:creator>
				<category><![CDATA[VoIP]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[Digium]]></category>
		<category><![CDATA[Skype]]></category>

		<guid isPermaLink="false">http://www.teamforrest.com/?p=136</guid>
		<description><![CDATA[VoIP Tech Chat posted an article about Digium&#8217;s public Beta launch of Skype for Asterisk. They wrote the article in a Billy Mays style: Limited Time Offer &#8211; Skype for Asterisk Public Beta]]></description>
			<content:encoded><![CDATA[<p>VoIP Tech Chat posted an article about Digium&#8217;s public Beta launch of Skype for Asterisk.</p>
<p>They wrote the article in a Billy Mays style:</p>
<p><a href="http://www.voiptechchat.com/voip/303/skype-for-asterisk-beta-limited-time-offer/">Limited Time Offer &#8211; Skype for Asterisk Public Beta</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.teamforrest.com/blog/136/skype-for-asterisk-public-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asterisk Consulting Services</title>
		<link>http://www.teamforrest.com/blog/119/asterisk-consulting-services/</link>
		<comments>http://www.teamforrest.com/blog/119/asterisk-consulting-services/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 12:38:30 +0000</pubDate>
		<dc:creator>Fred Posner</dc:creator>
				<category><![CDATA[VoIP]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[SIP]]></category>
		<category><![CDATA[voicemail]]></category>

		<guid isPermaLink="false">http://www.teamforrest.com/?p=119</guid>
		<description><![CDATA[Team Forrest offers Asterisk Consulting Services for a wide variety of VoIP, Call Center, and other Telephony Based needs. From small, family business to large Corporations, Team Forrest’s simple philosophy of “Help the Client” ensures we provide great service to &#8230; <a href="http://www.teamforrest.com/blog/119/asterisk-consulting-services/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-42 alignright" title="asterisk-by-digium" src="http://www.teamforrest.com/blog/wp-content/uploads/2008/12/asterisk-by-digium-300x245.gif" alt="Asterisk is a registered trademark of Digium" /></p>
<p>Team Forrest offers Asterisk Consulting Services for a wide variety of VoIP, Call Center, and other Telephony Based needs. From small, family business to large Corporations, Team Forrest’s simple philosophy of “Help the Client” ensures we provide great service to meet your needs.</p>
<h2>Asterisk Consulting</h2>
<p>From carrier services to traditional PBX services, Team Forrest’s Asterisk Consulting Service provides you the solution you need. Services include:</p>
<ul>
<li>IVR Development</li>
<li>Custom AGI Scripting / Programming</li>
<li>OpenSER Integration</li>
<li>Calling Card Systems</li>
<li>Call Center / Sales Queue Development</li>
<li>Call Recording (call spying, call barging, whisper, etc.)</li>
<li>Database Integration (Microsoft SQL MSSQL, MySQL, Oracle, etc.)</li>
<li>Custom Solutions</li>
</ul>
<h2>Emergency Asterisk Support</h2>
<p>When a problem comes along, we provide <strong>24/7 Emergency Support </strong>to bring your system back to life. Both new and existing clients benefit from our immediate support response.</p>
<p>For immediate support please <a href="/contact/">contact</a> us or call <strong>+1 (212) 937-7844</strong>.</p>
<h2>Remote and Onsite Support</h2>
<p>Team Forrest offers <strong>immediate</strong> remote assistance across the globe. Local, onsite service is also available, with quick response to Michigan, Florida, and New York locations.</p>
<h2>Asterisk? Ask us.</h2>
<p>With Team Forrest, you get professional consulting at a great price — <strong>increased productivity</strong> at a <strong>lower cost</strong>. To see how Team Forrest can help improve your communication needs, <a href="/contact">contact us</a>. We enjoy talking with clients and look forward to seeing how we can help you.</p>
<p>Asterisk, developed and released by <a href="http://www.digium.com">Digium, Inc.</a>, is the world’s leading open source telephony engine and tool kit. Asterisk empowers communication with it’s flexibility. Whether working as a simple office telephone system, a robust Call Center platform, or anything in-between, Asterisk provides advanced features at a very low deployment cost.  Asterisk is released as open source under the GNU General Public License (GPL), and it is available for download free of charge. Asterisk is the most popular open source software available, with the Asterisk Community being the top influencer in VoIP.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.teamforrest.com/blog/119/asterisk-consulting-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asterisk Security Advisory AST-2009-002</title>
		<link>http://www.teamforrest.com/blog/108/asterisk-security-advisory-ast-2009-002/</link>
		<comments>http://www.teamforrest.com/blog/108/asterisk-security-advisory-ast-2009-002/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 19:52:55 +0000</pubDate>
		<dc:creator>Fred Posner</dc:creator>
				<category><![CDATA[VoIP]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[SIP]]></category>

		<guid isPermaLink="false">http://www.teamforrest.com/?p=108</guid>
		<description><![CDATA[Digium announced today a Remote Crash Vulnerability in the SIP Channel Driver affecting recent versions of Asterisk 1.4 and 1.6 branches. The full Advisory can be read directly from the Asterisk Project Security Advisory: Description: When configured with pedantic=yes the &#8230; <a href="http://www.teamforrest.com/blog/108/asterisk-security-advisory-ast-2009-002/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.digium.com">Digium</a> announced today a Remote Crash Vulnerability in the SIP Channel Driver affecting recent versions of <a href="http://www.asterisk.org">Asterisk</a> 1.4 and 1.6 branches. The full Advisory can be read directly from the <a href="http://downloads.digium.com/pub/security/AST-2009-002.html">Asterisk Project Security Advisory</a>:</p>
<blockquote><p><strong>Description</strong>: When configured with pedantic=yes the SIP channel driver performs extra request URI checking on an INVITE received as a result of a SIP spiral. As part of this extra checking the headers from the outgoing SIP INVITE sent and the received SIP INVITE are compared. The code incorrectly assumes that the string for each header passed in will be non-NULL in all cases. This is incorrect because if no headers are present the value passed in will be NULL.</p>
<p>The values passed into the code are now checked to be non-NULL before being compared.</p>
<p><strong>Resolution</strong>: Upgrade to revision 174082 of the 1.4 branch, 174085 of the 1.6.0 branch, 174086 of the 1.6.1 branch, or one of the releases noted below.</p>
<p>The pedantic option in the SIP channel driver can also be turned off to prevent this issue from occurring.</p>
<p><strong>Affected Versions</strong></p>
<p>1.4.x (Versions 1.4.22, 1.4.23, 1.4.23.1)<br />
1.6.0.x (All versions prior to 1.6.0.6)<br />
1.6.1.x (All versions prior to 1.6.1.0-rc2)<br />
C.x.x (Only version C.2.3)</p></blockquote>
<p>If you need assistance in updating or reviewing your Asterisk installation, please <a href="http://www.teamforrest.com/contact">contact Team Forrest</a> today.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.teamforrest.com/blog/108/asterisk-security-advisory-ast-2009-002/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Asterisk S-Prize</title>
		<link>http://www.teamforrest.com/blog/106/the-asterisk-s-prize/</link>
		<comments>http://www.teamforrest.com/blog/106/the-asterisk-s-prize/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 06:35:19 +0000</pubDate>
		<dc:creator>Fred Posner</dc:creator>
				<category><![CDATA[VoIP]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[news]]></category>

		<guid isPermaLink="false">http://www.teamforrest.com/?p=106</guid>
		<description><![CDATA[John Todd, with Digium, announced a very cool contest — The Asterisk S-Prize. To encourage the improvement and testing of larger-scale Asterisk systems, I’d like to repeat here what I mentioned today on the asterisk-dev mailing list: I’m putting out &#8230; <a href="http://www.teamforrest.com/blog/106/the-asterisk-s-prize/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>John Todd, with Digium, announced a very cool contest — The Asterisk S-Prize.</p>
<blockquote><p>To encourage the improvement and testing of larger-scale Asterisk systems, I’d like to repeat here what I mentioned today on the asterisk-dev mailing list:  I’m putting out a semi-official challenge in place.  The first person to get an Asterisk system moving 10,000 G.711 call legs through a single instance on a single machine will get a first-class steak dinner at Astricon.  And a great bottle of wine, if that is your preference.</p></blockquote>
<p>To read more about the contest, check out the <a href="http://blogs.digium.com/2009/02/18/s-prize/">official post</a> at Digium.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.teamforrest.com/blog/106/the-asterisk-s-prize/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Asterisk Security Advisory</title>
		<link>http://www.teamforrest.com/blog/103/asterisk-security-advisory/</link>
		<comments>http://www.teamforrest.com/blog/103/asterisk-security-advisory/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 22:24:05 +0000</pubDate>
		<dc:creator>Fred Posner</dc:creator>
				<category><![CDATA[VoIP]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.teamforrest.com/?p=103</guid>
		<description><![CDATA[Digium, the makers of Asterisk, announced today a new release of the Asterisk Telephony Software. The updated software contains a security release affecting all previously released versions of the software. It is recommended that you make sure you have upgraded &#8230; <a href="http://www.teamforrest.com/blog/103/asterisk-security-advisory/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.digium.com">Digium</a>, the makers of <a href="http://www.asterisk.org">Asterisk</a>, announced today a new release of the Asterisk Telephony Software. The updated software contains a security release affecting all previously released versions of the software. It is recommended that you make sure you have upgraded to the most current version of this software; available for free from Digium.</p>
<p>The announcement issued follows:</p>
<blockquote><p>The Asterisk.org development team has announced the release of Asterisk 1.2.31.1, 1.4.22.2, 1.4.23.1, and 1.6.0.5. These releases are available for immediate download from <a href="http://downloads.digium.com/">http://downloads.digium.com/</a>.</p>
<p>This update for Asterisk includes a security fix for chan_iax2. Please see the associated security adivisory for more details:</p>
<p><a href="http://downloads.digium.com/pub/security/AST-2009-001.html">http://downloads.digium.com/pub/security/AST-2009-001.html</a></p>
<p>These updates are a fix to a previous security release (released as versions 1.2.31, 1.4.22.1, and 1.6.0.3).</p>
<p>The new versions are being released after additional testing revealed some issues with the way that scanning for users was blocked. Those issues have been corrected in this release.</p>
<p>This security issue affects the 1.2, 1.4, and 1.6 series of Asterisk.</p>
<p>Also note, that Asterisk 1.6.0.4-rc1 was released yesterday prior to the security update. That release has been removed as there will be no 1.6.0.4 release, but rather will be reincarnated as 1.6.0.6-rc1. The reason for the dead release is to avoid 5 digit release numbers.</p>
<p>ChangeLogs for the various releases are available at:</p>
<p>http://downloads.digium.com/pub/asterisk/ChangeLog-1.2.31.1</p>
<p>http://downloads.digium.com/pub/asterisk/ChangeLog-1.4.22.2</p>
<p>http://downloads.digium.com/pub/asterisk/ChangeLog-1.4.23.1</p>
<p>http://downloads.digium.com/pub/asterisk/ChangeLog-1.6.0.5</p>
<p>Thank you for your continued support of Asterisk!</p></blockquote>
<p>If you would like assistance with upgrading your software, or simply would like us to verify which version you are using, please <strong><a href="http://www.teamforrest.com/contact">contact</a></strong> Team Forrest today. We will be glad to assist you.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.teamforrest.com/blog/103/asterisk-security-advisory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

